PostgreSQL 11可重复读取隔离级别

时间:2019-02-16 00:42:01

标签: sql postgresql postgresql-11

我试图了解PostgreSQL隔离级别的实现,但无法理解我在做什么错。 我正在使用本地PostgreSQL 11和DBeaver 5.3.4作为我的IDE。

这是我正在测试的场景:

CREATE SCHEMA Test;
CREATE TABLE Test.T1 (Col1 INT PRIMARY KEY, Col2 CHAR(2) NOT NULL);
INSERT INTO Test.T1 (Col1, Col2) VALUES (1,'A'), (2,'B'), (3,'C');

我打开2个并发连接窗口到数据库。 在第一个命令中,我发出以下命令:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT * FROM Test.T1 WHERE Col1 = 2;

我得到了预期的结果:2-'B'。 然后,在另一个窗口中,发出以下命令:

BEGIN TRANSACTION;
UPDATE Test.T1 SET Col2 = 'XX' WHERE Col1 = 2;

现在,如果切换回第一个窗口,然后再次执行相同的SELECT:

SELECT * FROM Test.T1 WHERE Col1 = 2;

由于事务是从REPEATABLE READ隔离启动的,所以我希望从数据快照中看到结果,并获得可重复读取的2-'B',但是,我却获得了Col2 = 2-'的更新值。 xx'。

我在这里想念什么?

提前感谢您的帮助,祝您周末愉快!

1 个答案:

答案 0 :(得分:1)

由于@NickBarnes的建议,我已经找到了IDE设置并找到了问题。 事实证明,默认情况下,DBeaver对所有编辑器窗口使用相同的基础连接...

如果需要使用单独的连接,请转到“ SQL编辑器”的连接或全局设置,然后在“连接”下,选中“为每个编辑器使用单独的连接”。 我发现此默认设置是一个奇怪的选择,但至少现在我知道了原因。

祝你有美好的一天!