我试图了解 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' 的更新值。
我在这里想念什么?
提前感谢您的帮助,祝您周末愉快!