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