Rails 3交易和竞争条件

时间:2011-04-04 07:24:32

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

我正在创建一个浏览器RPG游戏,其中玩家有库存和仓库。想象一下,在某些时候,用户想要将物品从库存移动到仓库。现在安全问题必须紧张。

我认为这必须是一个交易。现在,您可以看到竞争条件的可能性。从仓库移动>仓库同时从仓库移动> inv可能意味着项目重复。

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

编辑 - 这个例子的比赛条件

从inv移动到仓库是一个函数,其中来自inv的项目首先被添加到仓库,然后从库存中删除。从仓库搬到inv是同样的想法。

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

结果:物品丢失

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

施皮罗斯,

将此置于交易中将解决一些问题,但不一定全部。看到这个问题:

Do database transactions prevent race conditions?