PostgreSQL ISOLATION LEVEL 生效的时间好像是在 first SELECT 之后
Time when PostgreSQL ISOLATION LEVEL takes effect seems to be after first SELECT
我是 运行 PostgreSQL 9.5.3.
我试图理解为什么我看到下面两个例程之间的行为差异。我发现这种行为违反直觉,但可能有一个很好的理由;我只想知道如果有的话是什么
设置 ISOLATION LEVEL REPEATABLE READ
似乎直到第一个 SELECT
语句之后才生效。
这两个例程之间的唯一区别是,在 "Routine 2" 中我添加了一个多余的 SELECT 1 ;
语句,而在 "Routine 1" 中我没有这样做。我在 "Routine 2".
中得到了我想要的结果
请参阅我之前发布的 ,其中我错误地认为我所看到的行为与我正在查询的特定表有关。
我修改了 krokodilko's 中的例程来演示我所看到的。谢谢,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)
(这也是我期待看到的)
根据the docs(强调我的):
REPEATABLE READ
All statements of the current transaction can only see rows committed before the first query or data-modification statement was executed in this transaction.
我只能猜测这样做的动机,但我认为这是因为在您开始查询数据之前它根本不重要。一旦你开始查询数据是一致的。
我是 运行 PostgreSQL 9.5.3.
我试图理解为什么我看到下面两个例程之间的行为差异。我发现这种行为违反直觉,但可能有一个很好的理由;我只想知道如果有的话是什么
设置 ISOLATION LEVEL REPEATABLE READ
似乎直到第一个 SELECT
语句之后才生效。
这两个例程之间的唯一区别是,在 "Routine 2" 中我添加了一个多余的 SELECT 1 ;
语句,而在 "Routine 1" 中我没有这样做。我在 "Routine 2".
请参阅我之前发布的
我修改了 krokodilko's
这些应该按照列出的顺序连续执行,在两个单独的会话之间来回切换。
例程 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)
(这也是我期待看到的)
根据the docs(强调我的):
REPEATABLE READ
All statements of the current transaction can only see rows committed before the first query or data-modification statement was executed in this transaction.
我只能猜测这样做的动机,但我认为这是因为在您开始查询数据之前它根本不重要。一旦你开始查询数据是一致的。