【问题标题】:PostgreSQL 11 REPEATABLE READ Isolation LevelPostgreSQL 11 REPEATABLE READ 隔离级别
【发布时间】: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


【解决方案1】:

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

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

祝你有美好的一天!

【讨论】:

  • 当我...检查时,我的显示“为每个编辑器打开单独的连接”。 (哈哈)。也许现在是默认设置?
猜你喜欢
  • 2022-09-23
  • 2012-04-07
  • 2022-01-09
  • 2012-01-07
  • 2015-06-19
  • 2019-09-23
  • 1970-01-01
  • 2021-01-30
  • 2013-12-22
相关资源
最近更新 更多