Время, когда PostgreSQL ISOLATION LEVEL вступает в силу, кажется, после первого SELECT

Я использую PostgreSQL 9.5.3.

Я пытаюсь понять, почему я вижу разницу в поведении двух приведенных ниже подпрограмм. Я нахожу такое поведение нелогичным, но для этого может быть очень веская причина; Я просто хочу знать, что это такое, если это так.

Настройка ISOLATION LEVEL REPEATABLE READ, похоже, не вступает в силу до первого оператора SELECT.

Единственная разница между двумя подпрограммами заключается в том, что в «Подпрограмме 2» я вставил лишнее выражение SELECT 1 ;, тогда как в «Подпрограмме 1» я этого не делал. Я получил желаемые результаты в «Рутине 2».

См. мой (слишком длинный) вопрос, который я опубликовал ранее. в котором я ошибочно предположил, что поведение, которое я видел, было как-то связано с тем, какие конкретные таблицы я запрашивал.

Я изменил процедуру из krokodilko ответить, чтобы продемонстрировать, что я вижу. Спасибо, крокодилко!


Они предназначены для последовательного выполнения в указанном порядке, переключаясь между двумя отдельными сеансами.

Процедура 1

Сессия 1:

testdb=# CREATE TABLE t1( x int ) ;
CREATE TABLE
testdb=# INSERT INTO t1 VALUES (1),(2),(3) ;
INSERT 0 3

Сессия 2:

testdb=# START TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
START TRANSACTION

Сессия 1:

testdb=# DELETE FROM t1 WHERE x = 2 ;
DELETE 1

Сессия 2:

testdb=# SELECT * FROM t1 ;
 x 
---
 1
 3
(2 rows)

(почему я вижу здесь эффекты сеанса 1?)

Сессия 2:

testdb=# COMMIT ;
COMMIT

Сессия 1:

testdb=# CREATE TABLE t1( x int ) ;
CREATE TABLE
testdb=# INSERT INTO t1 VALUES (1),(2),(3) ;
INSERT 0 3

Сессия 2:

testdb=# START TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
START TRANSACTION
testdb=# SELECT 1 ;
 ?column? 
----------
        1
(1 row)

(почему я должен это делать?)

Сессия 1:

testdb=# DELETE FROM t1 WHERE x = 2 ;
DELETE 1

Сессия 2:

testdb=# SELECT * FROM t1 ;
 x 
---
 1
 2
 3
(3 rows)

(это то, что я ожидал увидеть!)

Сессия 2:

testdb=# COMMIT ;
COMMIT
testdb=# SELECT * FROM t1 ;
 x 
---
 1
 3
(2 rows)

(это то, что я ожидал увидеть)


person rvrabbit    schedule 19.02.2017    source источник


Ответы (1)


Согласно документам (выделено мной):

ПОВТОРЯЕМОЕ ЧТЕНИЕ

Все операторы текущей транзакции могут видеть только те строки, которые зафиксированы до того, как в этой транзакции был выполнен первый запрос или оператор изменения данных.

Я могу только догадываться о мотивах для этого, но я думаю, что это просто не имеет значения, пока вы не начнете запрашивать данные. Как только вы начнете запрашивать данные, они согласуются.

person Matt S    schedule 19.02.2017
comment
Справедливо! Спасибо! Любая идея, почему это? - person rvrabbit; 19.02.2017
comment
Мотивация исходит из стандарта SQL. Вот как определяется повторяемое чтение - person a_horse_with_no_name; 19.02.2017