Спецификация для уровня изоляции Repeatable-Read определяет, что транзакция с этим IL не позволит другим транзакциям обновлять любые строки, прочитанные этой транзакцией, до завершения этой транзакции. Таким образом, повторяющиеся чтения гарантированы.
Рассмотрим следующий порядок операций для двух параллельных транзакций T1 и T2, в обеих из которых используется IL с повторяемым чтением:
- T1: чтение строки
- T2: прочитать строку
- T1: обновить строку
- T2: обновить строку
Я думаю, что обновление на шаге 3 нарушит спецификацию уровня изоляции, так как T2 будет читать другое значение, если он снова прочитает строку. Обратное можно сказать об обновлении на шаге 4.
Итак, какие различные варианты доступны для реляционных СУБД в целом для разрешения этого конфликта? В частности, как это обрабатывается в SQL Server 2017+? Приведет ли это к взаимоблокировке, поскольку ни одна из транзакций не может завершить свои операции? Или будет отменена одна транзакция? Я видел, что в SQL Server предотвращены потерянные обновления. Что это означает для разрешения этого конкретного случая?
Я просмотрел ответы на эти вопросы: Повторяемая таблица совместимости чтения и блокировки Повторяемое чтение - правильно ли я понимаю? повторяющееся чтение и вторая проблема с потерянными обновлениями Уровень изоляции MySQL Repeatable Read и явление Lost Update
И хотя последний задает аналогичный вопрос, но не содержит никакой конкретной информации о том, как СУБД, которые предотвращают потерю обновлений для txs с этим уровнем изоляции, обрабатывают этот случай.
UPDATE .. SELECT
. Это будет выполняться как одна атомарная операция, устанавливающая соответствующие блокировки за один шаг. - person Panagiotis Kanavos   schedule 29.01.2020