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