如何正确组成游戏 "Buy / Sell Item" 交易

How to correctly compose a game "Buy / Sell Item" transaction

我正在为角色扮演游戏开发“Buy/Sell 物品”功能。如果我是正确的,则需要在单个事务中执行以下操作

  1. 根据 playerID 从“玩家”中获取玩家 table
  2. 检查玩家是否有足够的金币,如果有则创建新的物品对象
  3. 将新项目对象写入“项目”table,其中所有者基于 pllayerID
  4. 更新所有者 playerID 所在的“玩家”table 行,根据物品成本扣除金币

如果上述玩家在交易 运行 或步骤 34 未能同时执行交易时发生金币变化,则交易应失败。

我已经阅读了文档并且可以看到 DynamoDB 有 TransactWriteItemsTransactGetItems 这似乎是完美的,但它们是分开的。我可以以某种方式在单笔交易中使用它们吗?

完成 playerID 后,您应该能够将第 4 步合并到第 2 步,然后在一个 TransactWriteItems:

中执行第 2-3 步
  1. UPDATE 有条件的金币价值 - 如果有足够的金币,立即扣除物品成本,否则条件失败,TransactWriteItems.
  2. 如果你在这里成功了,金币就足够了,你可以创建新对象并将其写入 Items table.

编辑以解释为什么这有效:

TransactWriteItems 将“更新金币”和“放置物品”这两个动作组合在一起 全有或全无操作:要么都成功,要么都失败。如果另一个操作干扰,它们也会失败(没有竞争条件)。

例如:

  • 如果金币不够,更新会失败,所以添加物品也会失败。
  • 如果添加项目失败,将不会保留对金币所做的更改(更新将“失败”)
  • 如果另一个操作正在修改金币数量,则两者都会失败。

从本质上讲,这是不可能的:

  1. 减去金币,不加项目
  2. 添加物品但不减去金币

因为它们都在 TransactWriteItems 操作中,所以要么都发生,要么都不发生。

您可以在 Java here 中找到示例。 (对于您的用例,您可以简单地删除客户验证并将“产品状态更新”更改为“玩家金币更新”并将“添加订单”更改为“添加项目”。)

有关详细信息,请参阅 TransactWriteItems 文档 here