Условия гонки баз данных

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

  • Пользователь 1 выбирает поле, скажем, numStock, которое равно 3
  • Пользователь 2 также выбирает numStock, который по-прежнему равен 3
  • Пользователь 1 уменьшает numStock (в приложении), и устанавливает его в 2 в базе данных.
  • Пользователь 2 также уменьшает numStock (в приложении) и устанавливает его равным 2 в базе данных.

В этом примере поле numStock должно было стать равным 1, но вместо этого было установлено значение 2 из-за конкуренции между пользователями.

Так что, конечно, можно использовать блокировки, но я подумал о другом способе решения этой проблемы — передаче всех сведений о строках в качестве критерия WHERE. Поясню...

В приведенном выше примере коды SQL могут выглядеть так:

//выбрать

SELECT itemID, numStock FROM items WHERE itemID = 45

//обновление

UPDATE items SET numStock = 2 WHERE itemID = 45

Моя идея для разрешения гонки:

//выбрать

SELECT itemID, numStock FROM items WHERE itemID = 45

//обновление

UPDATE items SET numStock = 2 WHERE itemID = 45 AND numStock = 3

Таким образом, запрос проверяет, не изменились ли данные с тех пор, как он выполнил выборку данных. Итак, мой вопрос: (1) Будет ли это [всегда] работать? и (2) является ли это лучшим вариантом по сравнению с механизмами блокировки базы данных (например, транзакциями MySQL)?

Спасибо за внимание.

5
задан Matt Larsen 24 March 2012 в 08:46
поделиться