如何正确组成游戏 "Buy / Sell Item" 交易
How to correctly compose a game "Buy / Sell Item" transaction
我正在为角色扮演游戏开发“Buy/Sell 物品”功能。如果我是正确的,则需要在单个事务中执行以下操作
- 根据
playerID
从“玩家”中获取玩家 table
- 检查玩家是否有足够的金币,如果有则创建新的物品对象
- 将新项目对象写入“项目”table,其中所有者基于
pllayerID
- 更新所有者
playerID
所在的“玩家”table 行,根据物品成本扣除金币
如果上述玩家在交易 运行 或步骤 3
或 4
未能同时执行交易时发生金币变化,则交易应失败。
我已经阅读了文档并且可以看到 DynamoDB 有 TransactWriteItems
和 TransactGetItems
这似乎是完美的,但它们是分开的。我可以以某种方式在单笔交易中使用它们吗?
完成 playerID
后,您应该能够将第 4 步合并到第 2 步,然后在一个 TransactWriteItems
:
中执行第 2-3 步
UPDATE
有条件的金币价值 - 如果有足够的金币,立即扣除物品成本,否则条件失败,TransactWriteItems
.
- 如果你在这里成功了,金币就足够了,你可以创建新对象并将其写入
Items
table.
编辑以解释为什么这有效:
TransactWriteItems
将“更新金币”和“放置物品”这两个动作组合在一起
全有或全无操作:要么都成功,要么都失败。如果另一个操作干扰,它们也会失败(没有竞争条件)。
例如:
- 如果金币不够,更新会失败,所以添加物品也会失败。
- 如果添加项目失败,将不会保留对金币所做的更改(更新将“失败”)
- 如果另一个操作正在修改金币数量,则两者都会失败。
从本质上讲,这是不可能的:
- 减去金币,不加项目
- 添加物品但不减去金币
因为它们都在 TransactWriteItems
操作中,所以要么都发生,要么都不发生。
您可以在 Java here 中找到示例。 (对于您的用例,您可以简单地删除客户验证并将“产品状态更新”更改为“玩家金币更新”并将“添加订单”更改为“添加项目”。)
有关详细信息,请参阅 TransactWriteItems
文档 here。
我正在为角色扮演游戏开发“Buy/Sell 物品”功能。如果我是正确的,则需要在单个事务中执行以下操作
- 根据
playerID
从“玩家”中获取玩家 table - 检查玩家是否有足够的金币,如果有则创建新的物品对象
- 将新项目对象写入“项目”table,其中所有者基于
pllayerID
- 更新所有者
playerID
所在的“玩家”table 行,根据物品成本扣除金币
如果上述玩家在交易 运行 或步骤 3
或 4
未能同时执行交易时发生金币变化,则交易应失败。
我已经阅读了文档并且可以看到 DynamoDB 有 TransactWriteItems
和 TransactGetItems
这似乎是完美的,但它们是分开的。我可以以某种方式在单笔交易中使用它们吗?
完成 playerID
后,您应该能够将第 4 步合并到第 2 步,然后在一个 TransactWriteItems
:
UPDATE
有条件的金币价值 - 如果有足够的金币,立即扣除物品成本,否则条件失败,TransactWriteItems
.- 如果你在这里成功了,金币就足够了,你可以创建新对象并将其写入
Items
table.
编辑以解释为什么这有效:
TransactWriteItems
将“更新金币”和“放置物品”这两个动作组合在一起
全有或全无操作:要么都成功,要么都失败。如果另一个操作干扰,它们也会失败(没有竞争条件)。
例如:
- 如果金币不够,更新会失败,所以添加物品也会失败。
- 如果添加项目失败,将不会保留对金币所做的更改(更新将“失败”)
- 如果另一个操作正在修改金币数量,则两者都会失败。
从本质上讲,这是不可能的:
- 减去金币,不加项目
- 添加物品但不减去金币
因为它们都在 TransactWriteItems
操作中,所以要么都发生,要么都不发生。
您可以在 Java here 中找到示例。 (对于您的用例,您可以简单地删除客户验证并将“产品状态更新”更改为“玩家金币更新”并将“添加订单”更改为“添加项目”。)
有关详细信息,请参阅 TransactWriteItems
文档 here。