Вопрос проверяет понимание уровней изоляции транзакций и механизма MVCC.
Snapshot isolation — это уровень изоляции, при котором транзакция работает со снимком данных на момент её начала. Она не видит изменения других незавершённых транзакций. Это позволяет избежать многих аномалий чтения и блокировок при чтении. В PostgreSQL это реализуется через MVCC.
Snapshot isolation основан на идее, что каждая транзакция работает со своей версией данных.
При старте транзакции:
фиксируется момент времени (snapshot)
транзакция видит только те строки, которые были зафиксированы до этого момента
изменения других транзакций становятся видны только после commit и только новым транзакциям
Определение
MVCC (Multi-Version Concurrency Control) — это механизм хранения нескольких версий строк.
Каждая строка содержит:
xmin — ID транзакции создания
xmax — ID транзакции удаления
База определяет, видна ли строка текущей транзакции.
Преимущества:
чтения не блокируют записи
записи не блокируют чтения
высокая производительность
Snapshot isolation не защищает от:
write skew
некоторых конфликтов записи
Поэтому иногда требуется уровень SERIALIZABLE.
Транзакция A:
BEGIN;
SELECT balance FROM account;
Пока она выполняется, изменения других транзакций ей не видны.
Snapshot isolation позволяет транзакциям работать со стабильным снимком данных, что снижает блокировки и повышает параллелизм, но не устраняет все возможные аномалии.