0

我正在创建一个浏览器RPG游戏,其中玩家有库存和仓库。想象一下,在某个时候,用户想要将物品从库存移动到仓库。现在安全性必须严密。Rails 3交易和竞赛条件

我想这必须是一个交易。现在,您可以在这里看到比赛条件的可能性。在从仓库 - > inv移动的同时,从inv-> warehouse移动可能意味着项目被复制。

那么,我该如何处理,以确保没有这样的事情发生?

EDIT - 对于实施例

从INV移动到仓库RACE条件是其中从INV项首先被添加到仓库,然后从清单中删除的功能。从仓库移动到inv是同一个想法。

现在,想到2个同时移动。 inv inv函数将项目添加到仓库。与此同时,相反的情况开始了。仓库将确切的物料移动到库存。它会找到要移动的项目,因为它刚刚移动。库存现在从库存中删除项目。仓库从仓库中删除物品。

结果:物品丢失

+0

您没有提供有关您的实现足够的细节,任何人有一个线索,你在说什么,或者为什么有可能是一个潜在的竞争条件。我能想到的最简单的模式是你可以谈论的是,从地点到项目有多对多的情况,在这种情况下,移动一个项目就意味着改变它的place_id。这本质上是原子的,没有任何重复或需要任何明确交易的风险。 – 2011-04-04 08:25:42

+0

真的:O?我想我的例子清楚地说明了为什么会有竞争条件。这与货币交易一样。 – Spyros 2011-04-04 08:28:23

+3

否 - 它不。正如我所说,在我能想到的项目和地点之间关系的最简单的实施中,我不认为有任何可能存在竞争条件的方式。如果一件物品指向一个地方,那么它一次只能在一个地方。改变指针正在改变这个地方,它本质上是原子的。这是一个记录中一个字段值的变化,那么怎么会有一场比赛呢?现在,如果你有一些更复杂的架构,你还没有描述... – 2011-04-04 08:51:39

回答

1

我居然发现如何防止在敏捷Rails的书的竞争条件。这是怎么回事就与金钱交易来完成:

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