我正在创建一个浏览器RPG游戏,其中玩家有库存和仓库。想象一下,在某些时候,用户想要将物品从库存移动到仓库。现在安全问题必须紧张。
我认为这必须是一个交易。现在,您可以看到竞争条件的可能性。从仓库移动>仓库同时从仓库移动> inv可能意味着项目重复。
那么,我该如何处理以确保不会发生这样的事情?
编辑 - 这个例子的比赛条件
从inv移动到仓库是一个函数,其中来自inv的项目首先被添加到仓库,然后从库存中删除。从仓库搬到inv是同样的想法。
现在,想想2个同步动作。 inv移动功能将项目添加到仓库。与此同时,相反的事情开始了。仓库将确切的项目移动到库存。它会找到要移动的项目,因为它只是被移动了。库存现在从库存中删除项目。仓库从仓库中删除物品。
结果:物品丢失
答案 0 :(得分:1)
我实际上已经找到了如何防止Agile Rails书中的竞争条件。这就是用钱进行交易的方式:
Account.transaction do
account1.deposit(100)
account2.withdraw(100)
end
答案 1 :(得分:0)