Я работаю над функциональностью «Купить/Продать предмет» для ролевой игры. Если я прав, следующие действия должны выполняться в одной транзакции.
playerID из таблицы «Игроки»pllayerIDplayerID, вычтите золото в зависимости от стоимости предмета.Если у вышеперечисленных игроков золото изменяется во время выполнения транзакции или шаг 3 или 4 не выполняется одновременно, транзакция должна завершиться ошибкой.
Я прочитал документы и вижу, что в DynamoDB есть TransactWriteItems и TransactGetItems, которые кажутся идеальными для этого, но они разные. Могу ли я как-то использовать их в одной транзакции?





Получив playerID, вы сможете объединить шаг 4 с шагом 2, а затем выполнить шаги 2-3 в одном TransactWriteItems:
UPDATE стоимость золота условно - если имеется достаточно золота, немедленно вычтите стоимость предмета, в противном случае условие не выполняется, как и TransactWriteItems.Items.Изменить для объяснения того, почему это работает:
TransactWriteItems группирует действия "Обновить золото" и "положить предмет" как одно целое
операция «все или ничего»: либо они оба успешны, либо они оба терпят неудачу. И если другая операция мешает, они также обе терпят неудачу (без состояния гонки).
Например:
Принципиально невозможно:
Поскольку они оба находятся в рамках операции TransactWriteItems, происходят либо оба, либо ни один из них.
Вы можете найти пример на Java здесь. (В вашем случае вы можете просто отказаться от проверки клиента и изменить «обновление статуса продукта» на «обновление золота игрока» и «добавить заказ» на «добавить элемент».)
Подробнее см. TransactWriteItems документацию здесь.
Я отредактировал ответ с объяснением атомарности TransactWriteItems и ссылкой на пример. Надеюсь, это поможет, дайте мне знать, если что-то все еще не ясно.
Это по-прежнему звучит как отдельные шаги, где значения могут меняться в условиях гонки, хотя я могу ошибаться. Любой шанс, что вы могли бы привести пример (подойдет любой язык кода)