0

Je crée un navigateur RPG jeu où le joueur a un inventaire et un entrepôt. Imaginez qu'à un moment donné, un utilisateur souhaite déplacer un article de l'inventaire vers l'entrepôt. Et maintenant, la sécurité doit être serrée. Je suppose que cela doit être une transaction. Maintenant, vous voyez les possibilités d'une condition de course ici. Passer d'inv-> warehouse en même temps que move from warehouse-> inv pourrait signifier qu'un item est dupliqué. Alors, comment puis-je gérer cela pour m'assurer que rien de tel ne se produise?Rails 3 Transactions et conditions de course

EDIT - CONDITION DE COURSE A CET EXEMPLE

passage d'inv à l'entrepôt est une fonction dans laquelle l'élément de inv est d'abord ajouté à l'entrepôt, puis supprimé de l'inventaire. Passer de l'entrepôt à l'inv est la même idée.

Maintenant, pensez à 2 mouvements simultanés. Une fonction de déplacement d'invs ajoute un élément à l'entrepôt. Au même moment, le contraire commence. Un entrepôt déplace l'article exact vers l'inventaire. Il va trouver l'objet à déplacer, car il vient d'être déplacé. L'inventaire supprime désormais l'élément de l'inventaire. L'entrepôt supprime l'article de l'entrepôt.

Résultat: L'article est perdu

+0

Vous n'avez pas fourni suffisamment de détails au sujet de votre mise en œuvre pour quiconque d'avoir une idée de ce que vous obtenez à, ou pourquoi il pourrait y avoir un potentiel pour une condition de course. Le schéma le plus simple que je puisse penser à propos duquel vous pourriez parler est qu'il y a un nombre de plusieurs à plusieurs de lieux en objets, dans ce cas, déplacer un élément signifierait simplement changer son place_id. Ce serait intrinsèquement atomique, sans risque de duplication ou de nécessité d'une transaction explicite. –

+0

vraiment: O? Je pense que mon exemple illustre clairement pourquoi il peut y avoir une condition de concurrence. C'est la même chose que dans la transaction d'argent. – Spyros

+3

Non - ce n'est pas le cas. Comme je l'ai dit, dans la mise en œuvre la plus simple que je puisse imaginer pour la relation entre les objets et les lieux, je ne vois pas comment il pourrait y avoir une condition de concurrence. Si un élément pointe vers un lieu, il ne peut être que dans un endroit à la fois. Changer le pointeur change l'endroit, et c'est intrinsèquement atomique. C'est un changement à une valeur de champ dans un enregistrement, alors comment pourrait-il y avoir une course? Maintenant, si vous avez une architecture plus complexe que vous n'avez pas décrite ... –

Répondre

1

j'ai trouvé comment éviter la condition de course dans le livre Rails Agile. Voici comment cela se ferait avec une transaction pour l'argent:

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