Может ли одновременное изменение значения повлиять на одиночный выбор в PostgreSQL 9.1?

Рассмотрим следующий запрос, выполненный в PostgreSQL 9.1 (или 9.2):

SELECT * FROM foo WHERE bar = true

Предположим, что это довольно длительный запрос (например, занимает минуту).

Если в начале запроса есть 5 миллионов записей, для которых bar = true удерживается, и во время этого запроса в другой транзакции в foo таблица, и для некоторых существующих строк обновляются bar поле.

Повлияет ли что-нибудь из этого на результат показанного выше запроса на выборку?

Я знаю об изоляции транзакций и видимости между отдельными операторами в одной транзакции, но как насчет одного выполняющегося оператора?

2 ответа

Решение

Нет.
Благодаря модели MVCC только кортежи, которые видны при запуске запроса, будут использоваться в одном SELECT, Подробности в руководстве здесь:

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

Акцент мой.

Запрос будет согласованным для чтения представлением данных на момент начала запроса. В Postgresql документация по Multi-Version Concurrency Control (MVCC) объясняет, как это делается (в таблице существует несколько версий записи). В Oracle номер изменения последовательности (SCN) используется вместе с "предыдущими образами" измененных данных. Вот старый документ, Transaction Processing в Postgresql, с разделом "Управление хранением без перезаписи". Но взгляните на MVCC.

Или прочитайте главу о MVCC в документе Postgresql

Другие вопросы по тегам