簡體   English   中英

PostgreSQL 11 REPEATABLE READ 隔離級別

[英]PostgreSQL 11 REPEATABLE READ Isolation Level

我試圖了解 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' 的更新值。

我在這里缺少什么?

提前感謝您的幫助,祝您周末愉快!

感謝@NickBarnes 的建議,我已經找到了 IDE 設置並發現了問題。 事實證明,默認情況下,DBeaver 對所有編輯器窗口使用相同的底層連接......

如果您需要使用單獨的連接,請轉到“SQL 編輯器”的連接或全局設置,並在連接下選中“為每個編輯器使用單獨的連接”。 我發現這個默認值是一個奇怪的選擇,但至少現在我知道原因了。

度過美好的一天!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM