Уровень изоляции repeatable_read с блокировкой pessimistic_write

Прямо сейчас я запрещаю нескольким пользователям из нескольких экземпляров обращаться к одной и той же строке моей таблицы базы данных с помощью блокировки PESSIMISTIC_WRITE. Для транзакции, которая блокирует строку, установлен уровень изоляции по умолчанию, равный REPEATABLE_READ.

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

Пытаясь понять это, я изменил уровень изоляции на READ_COMMITED, и проблема больше не возникала.

Может кто-нибудь просветить меня, как это возможно? Что мне не хватает?

Вот немного психо-кода для лучшего понимания:

Асинхронная заправка

Transaction
get values to insert
bulk insert

Получение ценностей

Transaction
read a row for update (Locks it)
do stuff
delete the row

Для блокировки мы используем эту аннотацию из данных Spring: @Lock(LockModeType.PESSIMISTIC_WRITE)

1
0
326
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, ответ таков, что Aurora Prier до Aurora 2.x использовал MySQL 5.6.10. Aurora 2.x теперь использует MySQL 5.7.12, и проблема заключалась в ошибке, которая теперь исправлена.

P.S. Я все еще спрашиваю себя, почему Aurora использует версию MySQL двухлетней давности, но это уже другая история.

Другие вопросы по теме