В PostgreSQL REPEATABLE READ предотвращает перезапись конкурентно изменённой строки из старого снимка, завершая такую транзакцию ошибкой. Её нужно повторить целиком; для более общих инвариантов рассмотрите SERIALIZABLE.
Уровни изоляции
В PostgreSQL REPEATABLE READ предотвращает перезапись конкурентно изменённой строки из старого снимка, завершая такую транзакцию ошибкой. Её нужно повторить целиком; для более общих инвариантов рассмотрите SERIALIZABLE.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Уровни изоляции
Существующие уровни изоляции (стандарты) READ_UNCOMMITTED READ_COMMITTED REPEATABLE_READ SERIALIZABLE
Задача Есть 3 entity:
- Entity1
- Entity2
- Entity3
База данных postgres
Задача Какой уровень изоляции для обеих транзакций для гарантии отсутствия потери данных в данных сценариях и почему:
Сценарий 1 (соответствует времени выполнения)
-
Open transaction 1;
-
select Entity1;
-
select Entity2;
-
Open transaction 2;
-
select Entity1;
-
update Entity1; **********
-
Commit transaction 2;
-
update Entity1; ->transaction 1
-
update Entity2; ->transaction 1
Ответ
В PostgreSQL REPEATABLE READ предотвращает перезапись конкурентно изменённой строки из старого снимка, завершая такую транзакцию ошибкой. Её нужно повторить целиком; для более общих инвариантов рассмотрите SERIALIZABLE.
В сценарии T1 уже читала Entity1, затем T2 изменила её и закоммитилась. При REPEATABLE READ T1 не сможет просто обновить новую версию из своего старого снимка: ожидается serialization failure. READ COMMITTED допускает потерю изменения, если приложение записывает заранее вычисленное устаревшее значение. Альтернатива — ранний SELECT FOR UPDATE или проверка версии. Сам уровень не гарантирует успех обеих попыток: нужны повторы и корректная бизнес-логика для Entity2.