gpt4 book ai didi

postgresql - PostgreSQL ISOLATION LEVEL 生效的时间似乎是在第一次 SELECT 之后

转载 作者:行者123 更新时间:2023-11-29 13:20:42 26 4
gpt4 key购买 nike

我正在运行 PostgreSQL 9.5.3。

我试图理解为什么我看到下面两个例程之间的行为差​​异。我发现这种行为违反直觉,但可能有一个很好的理由;如果是的话,我只想知道它是什么。

设置 ISOLATION LEVEL REPEATABLE READ 似乎在第一个 SELECT 语句之后才生效。

这两个例程之间的唯一区别是,在“例程 2”中我放入了多余的 SELECT 1 ; 语句,而在“例程 1”中我没有这样做。我在“例程 2”中得到了我想要的结果。

请参阅我之前发布的 my (overly-lengthy) question,其中我错误地认为我所看到的行为与我正在查询的特定表有关。

我修改了 krokodilkoanswer 中的例程来演示我所看到的。谢谢,krokodilko!


这些将按照列出的顺序连续执行,在两个单独的 session 之间来回切换。

例程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 - PostgreSQL ISOLATION LEVEL 生效的时间似乎是在第一次 SELECT 之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42322730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com