我试图理解PostgreSQL隔离级别的实现,但我不能理解我做错了什么。我使用本地的PostgreSQL 11和DBeaver 5.3.4作为我的集成开发环境。
下面是我正在测试的场景:
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');我打开了两个到数据库的并发连接窗口。在第一个命令中,我发出以下命令:
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;由于事务是以可重复读取隔离启动的,因此我希望看到数据快照的结果,并获得2-'B‘的可重复读取,但实际上,我获得了Col2 = 2-'xx’的更新值。
这里我漏掉了什么?
提前感谢您的帮助,祝您周末愉快!
发布于 2019-02-19 00:46:52
感谢@NickBarnes的建议,我追踪到了IDE设置并找到了问题所在。事实证明,在默认情况下,DBeaver对所有编辑器窗口都使用相同的底层连接...
如果您需要使用单独的连接,请转到"SQL编辑器“的连接或全局设置,在”连接“下,选中”为每个编辑器使用单独的连接“。我发现这个默认值是一个奇怪的选择,但至少现在我知道原因了。
祝你有美好的一天!
https://stackoverflow.com/questions/54718766
复制相似问题