Rails 3 Транзакции и условия гонки - PullRequest
0 голосов
/ 04 апреля 2011

Я создаю браузерную ролевую игру, в которой у игрока есть инвентарь и склад.Представьте, что в какой-то момент пользователь хочет переместить предмет из инвентаря на склад.И теперь безопасность должна быть жесткой.

Я полагаю, что это должна быть транзакция.Теперь вы видите возможности для состояния гонки здесь.Перемещение из inv-> warehouse в то же время, что и перемещение со склада-> inv, может означать, что предмет дублируется.

Итак, как мне справиться с этим, чтобы ничего подобного не происходило?

РЕДАКТИРОВАТЬ - УСЛОВИЯ РАСЫ ДЛЯ ЭТОГО ПРИМЕРА

Перемещение от inv к складу - это функция, при которой предмет из inv сначала добавляется на склад, а затем удаляется из инвентаря.Перемещение со склада в инв это та же идея.

Теперь подумайте о 2 одновременных ходах.Функция перемещения In добавляет товар на склад.В то же самое время начинается обратное.Склад перемещает точный предмет в инвентарь.Он найдет предмет для перемещения, так как он был только что перемещен.Инвентарь теперь удаляет предмет из инвентаря.Склад удаляет товар со склада.

Результат: Товар утерян

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

Я действительно нашел способ предотвратить состояние гонки в книге Agile Rails.Вот как это можно сделать с транзакцией за деньги:

Account.transaction do
  account1.deposit(100)
  account2.withdraw(100)
end
0 голосов
/ 27 сентября 2011

Спирос,

Внесение этого в транзакцию решит некоторые проблемы, но не обязательно все. Смотрите этот вопрос:

Предотвращают ли транзакции базы данных условия гонки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...