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

Цитата из http://www.postgresql.org/docs/9.4/static/transaction-iso.html:

Когда вы выбираете уровень Read Uncommitted, вы действительно получаете Read Committed, а фантомные чтения невозможны в реализации PostgreSQL Repeatable Read, поэтому фактический уровень изоляции может быть более строгим, чем выбранный вами.

Чтобы уточнить: означает ли это повторяемое чтение pg = сериализуемое?


person Radek Postołowicz    schedule 05.06.2015    source источник
comment
Обратите внимание, что в более старых версиях PostgreSQL (в частности, до 9.1) ответ на ваш вопрос - да, они такие же. 9.1 представил настоящий сериализуемый режим, что означает, что Repeatable Read и Serializable теперь являются двумя разными уровнями изоляции с разными правилами.   -  person Mark Hildreth    schedule 05.06.2015
comment
@MarkHildreth Хороший улов, я исправлю это в своем ответе.   -  person IMSoP    schedule 06.06.2015


Ответы (2)


Нет; разница описана на странице, на которую вы указали ссылку:

Фактически, этот уровень изоляции работает точно так же, как Repeatable Read, за исключением того, что он отслеживает условия, которые могут привести к тому, что выполнение параллельного набора сериализуемых транзакций будет вести себя несовместимо со всеми возможными последовательными (по одному) выполнением этих транзакций.

В документации приводится пример, в котором Repeatable Read и Serializable ведут себя по-разному. Сериализуемая транзакция может быть прервана из-за «ошибки сериализации», но не блокирует завершение каких-либо дополнительных транзакций.

В процитированном вами разделе объясняются некоторые аномалии, поскольку стандартные уровни изоляции SQL предназначены для блокировки данных, но PostgreSQL реализован по схеме «MVCC», в которой параллельным транзакциям могут быть предоставлены независимые моментальные снимки данных. Таким образом, некоторые из различий, присутствующих в других системах, неприменимы, и Postgres интерпретирует уровни изоляции как «по крайней мере такие же строгие, как ...»

Как отметил в комментариях Марк Хилдрет, это различие верно только для PostgreSQL 9.1 и новее. В документации для 9.0 говорится:

Но внутренне существует только два различных уровня изоляции, которые соответствуют уровням Read Committed и Serializable.

Принимая во внимание, что в более новых версиях это было изменено на:

Но внутри существует только три различных уровня изоляции, которые соответствуют уровням Read Committed, Repeatable Read и Serializable.

person IMSoP    schedule 05.06.2015

No.

Повторяющееся чтение - это изоляция моментальных снимков. Это означает, что ваша транзакция видит единый непротиворечивый «снимок» базы данных. Это не полная сериализуемость, потому что некоторые операции могут давать результаты, несовместимые с каким-либо последовательным порядком. Например, если одна транзакция вставляет строку, которая соответствует операции SELECT другой транзакции, и наоборот, это может вызвать аномалии сериализации. Serializable использует технологию, называемую «блокировкой предикатов», для обнаружения таких ситуаций и отклонения любых транзакций, вызывающих нарушение. Эта «блокировка» не блокирует транзакцию и не может участвовать в тупиковой ситуации.

person Kevin    schedule 05.06.2015