Я слышал о многих разработчиках приложений, испытывающих небольшие проблемы в отношении условий гонки при обработке базы данных. Типичный пример выглядит примерно так:
В этом примере поле 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)?
Спасибо за внимание.