【发布时间】: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