Я использую 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)
(это то, что я ожидал увидеть)