digital-garden/_inbox/Repeatable read.md

2.7 KiB
Raw Blame History

aliases tags date zero-link parents linked
повторяющееся чтение
зрелость/🌱
2024-06-19
00 Базы Данных
Уровни изоляций транзакций БД

Repeatable read (повторяющееся чтение). Уровень, при котором читающая транзакция «не видит» изменения данных, которые были ею ранее прочитаны. При этом никакая другая транзакция не может изменять данные, читаемые текущей транзакцией, пока та не окончена. ^38dd4b

Первая транзакция началась. Считала баланс первого пользователя. Обновила его, но не зафиксировала изменения. Началась вторая транзакция. Она также считала баланс первого пользователя, обновила его, но тоже не зафиксировала свои изменения.

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

Но если вторая транзакция не изменяла данные, а добавляла новые строчки, то исключения не было бы. Также проблем не будет, если мы обновим баланс второго пользователя.

Но возникает закономерный вопрос: что делать с ошибкой, ведь мы хотели выполнить транзакцию, которая свалилась с исключением. Самое простое, что можно сделать — это повторить выполнение второй транзакции с новыми данными. Если исключение возникнет опять, то повторить снова.

Реализация:

  • Блокировки. Чтение не блокирует запись, а запись не блокирует чтение.
  • MVCC

Особенности

  • В PostgreSQL на уровне REPEATABLE_READ также предотвращены фантомные чтения.

Проблемы: