Выберите с помощью Read Committed, поясните, пожалуйста

http://www.postgresql.org/docs/9.1/static/transaction-iso.html В документации о прочитанном уровне изоляции указано

Read Committed - это уровень изоляции по умолчанию в PostgreSQL. Когда транзакция использует этот уровень изоляции, запрос SELECT (без предложения FOR UPDATE / SHARE) видит только данные, зафиксированные до начала запроса; он никогда не видит ни незафиксированных данных, ни изменений, зафиксированных во время выполнения запроса параллельными транзакциями. Фактически, запрос SELECT видит моментальный снимок базы данных в момент начала выполнения запроса. Однако SELECT видит эффекты предыдущих обновлений, выполненных в рамках его собственной транзакции, даже если они еще не зафиксированы. Также обратите внимание, что две последовательные команды SELECT могут видеть разные данные, даже если они находятся в одной транзакции, если другие транзакции фиксируют изменения во время выполнения первого SELECT.

Последнее предложение меня смущает, что это значит? Что, если у меня есть не 2 выбора в транзакции, а 3, а также несколько вычислений без использования DML между ними? Каждый выбор будет видеть свой снимок в момент начала каждого запроса?


person MaxNevermind    schedule 03.05.2014    source источник


Ответы (1)


Последнее предложение относится к этой ситуации.

Предположим, что есть таблица foo, которая содержит одну строку перед началом обеих транзакций:

Transaction 1            Transaction 2
-------------------------------------------------------
begin transaction;
select *
from foo;
--> returns 1 rows
                         begin transaction;
                         insert into foo values (2);
                         commit;
select * 
from foo;
--> now returns 2 rows

(Обратите внимание, что транзакция 1 не была зафиксирована после первого выбора)

Если вы не хотите видеть новую (зафиксированную) строку в транзакции 1, вам нужно будет использовать уровень изоляции, называемый «повторяемое чтение». Название связано с тем, что вы можете повторять один и тот же запрос снова и снова, и вы будете постоянно видеть одни и те же данные.

person a_horse_with_no_name    schedule 03.05.2014