Выбор ответа Middle Транзакции и изоляция обновлено
Read Uncommitted в PostgreSQL
Вопрос
Что будет, если в PostgreSQL выполнить SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED и прочитать строку, которую другая транзакция изменила, но ещё не закоммитила?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Увидим старую версию, как в Read Committed. Стандарт разрешает грязное чтение на этом уровне, но не требует его.
Варианты ответа
- Увидим незакоммиченное новое значение (dirty read)
- Увидим старую версию, как в Read Committedправильный ответ
- Ошибка: этот уровень в PostgreSQL не поддерживается
- Чтение заблокируется до коммита другой транзакции
Разбор
Стандарт разрешает грязное чтение на этом уровне, но не требует его. В PostgreSQL благодаря MVCC грязного чтения нет совсем: уровень принимается без ошибки и ведёт себя как Read Committed. Чтение и не блокируется: читатели в MVCC не ждут писателей, они видят предыдущую версию строки.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Транзакции и изоляция»
- Advisory-блокировки в PostgreSQL
- Как избежать deadlock при переводах
- Взаимоблокировки: как ловить и предотвращать
- Долгая транзакция и раздувание таблиц
- MVCC и VACUUM в PostgreSQL
- VACUUM или VACUUM FULL на проде
- Зачем нужна заморозка и что такое wraparound
- Что делает PostgreSQL при deadlock