Как правильно реализовать оптимистическую блокировку в MySQL?
Наша команда пришла к выводу, что мы должны сделать № 4 ниже, иначе есть риск, что другой поток может обновить ту же версию записи, но мы хотели бы проверить, что это лучший способ сделать это.
- Создайте поле версии в таблице, для которой вы хотите использовать оптимистическую блокировку, например, столбец name = "версия"
- При выборе обязательно включите столбец версии и запишите версию
- При последующем обновлении записи оператор обновления должен выдать «где версия = X», где X - версия, которую мы получили в # 2, и установить поле версии во время этого оператора обновления на X + 1.
- Выполните
SELECT FOR UPDATE
запись, которую мы собираемся обновить, чтобы сериализовать, кто может вносить изменения в запись, которую мы пытаемся обновить.
Чтобы уточнить, мы пытаемся предотвратить перезапись друг друга двумя потоками, которые выбирают одну и ту же запись в одном и том же временном окне, где они захватывают одну и ту же версию записи, если они попытаются обновить запись одновременно. Мы считаем, что если мы не выполним # 4, есть вероятность, что, если оба потока одновременно введут свои соответствующие транзакции (но еще не выпустили свои обновления), когда они пойдут на обновление, второй поток будет использовать UPDATE. ... где версия = X будет работать со старыми данными.
Правильны ли мы, думая, что мы должны делать эту пессимистическую блокировку при обновлении, даже если мы используем поля версий / оптимистическую блокировку?
SELECT ... FOR UPDATE
оптимистическая блокировка, либо версионность строк, а не обе. Подробности смотрите в ответе.