我在运行PostgreSQL 9.5.3。
我试图理解为什么我看到下面两个程序之间的行为差异。我发现这种行为违反直觉,但可能有一个很好的理由;我只想知道如果是的话是什么。
设置ISOLATION LEVEL REPEATABLE READ
似乎直到第一个SELECT
语句之后才生效。
这两个例程之间的唯一区别是,在“例程2”中,我输入了多余的SELECT 1 ;
语句,而在“例程1”中,我没有这样做。我在“常规2”中得到了我想要的结果。
请看我之前发布的my (overly-lengthy) question,我错误地认为我看到的行为与我正在查询的特定表有关。
我把程序从krokodilko改为answer来演示我看到的东西。谢谢,克罗科迪尔科!
这些会话按所列顺序依次执行,在两个单独的会话之间来回切换。
程序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(强调我的):
可重复读取
当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。
我只能猜测这样做的动机,但我认为这是因为在你开始查询数据之前这根本不重要。一旦你开始查询数据是一致的。
关于postgresql - PostgreSQL ISOLATION LEVEL生效的时间似乎在第一次SELECT之后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42322730/