【发布时间】:2019-02-16 00:42:01
【问题描述】:
我试图了解 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'。
我在这里错过了什么?
提前感谢您的帮助,祝您周末愉快!
【问题讨论】:
-
可能您的 IDE 试图在后台为您“管理”事务和/或连接。看看你能不能用
psql复制它。 -
@NickBarnes 好像你是对的。谢谢。如果你把它作为一个答案,我会这样标记它。
-
我发现了问题 - 结果是默认情况下,DBeaver 对所有编辑器窗口使用相同的底层连接...必须进入“SQL 编辑器”的全局设置并在连接下,检查“使用每个编辑器的单独连接”...
-
乐于助人!但是既然你已经找到了原因和解决方案,我想说你比我更有资格回答这个问题;)
标签: sql postgresql postgresql-11