Amazon dynamodb 如何正确地编写一个游戏;“购买/出售物品”;交易

Amazon dynamodb 如何正确地编写一个游戏;“购买/出售物品”;交易,amazon-dynamodb,Amazon Dynamodb,我正在为rpg游戏开发“购买/出售物品”功能。如果我是正确的,则需要在单个事务中执行以下操作 根据“玩家”表中的playerID获取玩家 检查玩家是否有足够的金币,如果有,创建新物品对象 将新项目对象写入“项目”表,其中所有者基于pllayerID 更新“玩家”表中所有者为玩家ID的行,根据物品成本扣除金币 如果在上述玩家中,在事务运行或步骤3或4无法同时执行时,gold发生变化,则事务应失败 我已经阅读了文档,可以看到DynamoDB有TransactionWriteItems和Transac

我正在为rpg游戏开发“购买/出售物品”功能。如果我是正确的,则需要在单个事务中执行以下操作

  • 根据“玩家”表中的
    playerID
    获取玩家
  • 检查玩家是否有足够的金币,如果有,创建新物品对象
  • 将新项目对象写入“项目”表,其中所有者基于
    pllayerID
  • 更新“玩家”表中所有者为玩家ID的行,根据物品成本扣除金币
  • 如果在上述玩家中,在事务运行或步骤
    3
    4
    无法同时执行时,gold发生变化,则事务应失败


    我已经阅读了文档,可以看到DynamoDB有
    TransactionWriteItems
    TransactionGetItems
    ,这两个项目似乎非常适合于此,但它们是分开的。我可以在单个事务中使用它们吗?

    一旦您拥有
    playerID
    ,您应该能够将步骤4合并到步骤2,然后在一个
    事务写入项中执行步骤2-3

  • 有条件地更新
    黄金的价值-如果有足够的黄金,立即扣除项目成本,否则条件失败,
    TransactionWriteItems
  • 如果您在此处创建,则有足够的黄金,您可以创建新对象并将其写入
    Items
  • 编辑以解释此操作的原因:

    TransactionWriteItems
    将操作“更新黄金”和“放置项目”分组为单个项目 全有或全无操作:要么都成功,要么都失败。如果另一个操作受到干扰,它们也都会失败(无竞争条件)

    例如:

    • 如果没有足够的黄金,更新将失败,因此添加项目也将失败
    • 如果添加项目失败,对黄金所做的更改将不会保留(更新将“失败”)
    • 如果另一个操作正在修改黄金金额,则两个操作都会失败
    基本上,不可能:

  • 减去黄金,但不加项目
  • 添加项目,但不要减去黄金
  • 因为它们都在
    TransactionWriteItems
    操作中,所以要么两者都发生,要么两者都不发生

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


    有关更多详细信息,请参阅
    TransactionWriteItems
    文档。

    这听起来仍然像是单独的步骤,在竞争条件下,值可能会发生变化,但我可能有点误解。如果您有机会提供一个示例(任何代码语言都可以),我编辑了答案,并解释了TransactionWriteItems的原子性和到示例的链接。希望这能有所帮助,如果还有什么不清楚,请告诉我。