【问题标题】:Rails 3 Transactions and Race ConditionsRails 3 事务和竞争条件
【发布时间】:2011-04-04 07:24:32
【问题描述】:

我正在创建一个玩家拥有库存和仓库的浏览器 rpg 游戏。想象一下,在某个时候,用户想要将物品从库存移动到仓库。现在必须加强安全性。

我想这一定是一笔交易。现在,您在这里看到了竞争条件的可能性。从 inv->warehouse 同时从仓库->inv 移动可能意味着一个项目是重复的。

那么,我该如何处理以确保不会发生类似的情况?

编辑——该示例的比赛条件

从 inv 移至仓库是一项功能,其中 inv 中的项目首先添加到仓库,然后从库存中删除。从仓库转移到 inv 也是同样的想法。

现在,想想 2 个同时移动。 inv 移动功能将项目添加到仓库。与此同时,相反的开始。仓库将确切的项目移动到库存。它会找到要移动的项目,因为它刚刚被移动。库存现在从库存中删除项目。仓库从仓库中删除项目。

结果:物品丢失

【问题讨论】:

  • 您没有提供有关您的实施的足够详细信息,以便任何人了解您正在了解什么,或者为什么可能存在竞争条件。我能想到的最简单的模式,你可以谈论的是,从地点到项目是多对多的,在这种情况下,移动项目仅仅意味着改变它的 place_id。这本质上是原子的,没有任何重复的风险或需要任何显式事务。
  • 真的:O?我认为我的例子清楚地说明了为什么会有竞争条件。与货币交易相同。
  • 不——它没有。正如我所说,在我能想到的关于项目和地点之间关系的最简单实现中,我看不到任何可能存在竞争条件的方式。如果一个项目指向一个地方,那么它一次只能在一个地方。改变指针就是改变位置,它本质上是原子的。这是对一个记录中的一个字段值的一次更改,那么怎么会有比赛呢?现在,如果您有一些尚未描述的更复杂的架构......
  • 编辑了我的答案以描述竞争条件如何适用于这种情况。
  • 您的商品和仓库的模型关联是什么?我会假设多对多,在这种情况下,项目和仓库 id 都应该是唯一的。从而消除您遇到的任何类型的竞争条件问题......对吗?

标签: ruby-on-rails database security transactions race-condition


【解决方案1】:

我实际上在 Agile Rails 书中找到了如何防止竞争条件。这就是金钱交易的方式:

Account.transaction do
  account1.deposit(100)
  account2.withdraw(100)
end

【讨论】:

    【解决方案2】:

    斯派罗斯,

    将其放入事务中可以解决一些问题,但不一定是全部。看到这个问题:

    Do database transactions prevent race conditions?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多