На уровне изоляции повторяемого чтения не должен ли MySQL MVCC предотвращать потерянное обновление с использованием пессимистической блокировки на уровне базы данных, приводящей к откату транзакции?
В соответствии со стандартом SQL повторяемое чтение должно предотвращать:
- грязное чтение
- неповторяемое чтение
Стандарт ничего не говорит о потерянных обновлениях, поскольку стандарт был разработан, когда 2PL (двухфазныйБлокировка) был фактическим механизмом управления валютой.
Если вы используете 2PL, то уровень изоляции Repeatable Read действительно предотвратит Lost Update .
Тем не менее, MVCC может предоставлять Repeatable Reads через несколько версий кортежа, но для предотвращения Lost Updates им также нужен планировщик транзакций для отслеживания модификаций кортежа для записей, прочитанных определенной транзакцией.Очевидно, что InnoDB не работает таким образом.
не должен MySQL MVCC предотвращать Lost Update с использованием пессимистической блокировки на уровне базы данных, что приводит к откату транзакции
Теперь, если вы внимательно прочиталиВ главе Транзакции в моей книге High-Performance Java Persistence вы обнаружите, что MVCC не использует пессимистическую блокировку при повторяемом чтении.Единственными принятыми блокировками являются блокировки промежутка и следующего ключа, взятые в кластеризованном индексе, но они не предотвращают потерянные обновления.
MySQL использует пессимистическую блокировку только для Serializable, что обеспечивает модель управления параллелизмом 2PL, дажепри использовании механизма хранения InnoDB на основе MVCC.