簡體   English   中英

具有可序列化隔離級別的兩個 PostgreSQL 事務發生沖突

[英]Conflict on two PostgreSQL transactions with serializable isolation level

我有兩個並發 SQL 事務,具有最嚴格的隔離級別(可序列化)

根據這里

SQL 標准定義了四個級別的事務隔離。 最嚴格的是 Serializable,它是由標准在一段中定義的,它說一組 Serializable 事務的任何並發執行都保證產生與以某種順序一次運行一個相同的效果

或從 MSDN 關於 SET TRANSACTION ISOLATION LEVEL:

在數據集上放置一個范圍鎖,防止其他用戶在事務完成之前更新或插入數據集。 這是四個隔離級別中限制最大的。 由於並發性較低,因此僅在必要時使用此選項。 此選項與在事務中的所有 SELECT 語句中的所有表上設置 HOLDLOCK 的效果相同。

但是你看到在第二個事務的中間,表是空的。 這怎么可能,我該如何解決?

具有可序列化隔離級別的兩個 Postgres 事務的沖突

這是 Postgres 提供系統目錄方式的結果。 文檔中的相關注釋已經足夠清楚了:

對系統目錄的內部訪問不是使用當前事務的隔離級別完成的。 這意味着新創建的數據庫對象(例如表)對並發可重復讀取和可序列化事務可見,即使它們包含的行不可見。

您提供的示例沒有違反有關可序列化隔離級別的引用規則。 請注意,當第一個事務刪除並創建表時,您啟動第二個事務。 結果行為符合預期。

如果您在刪除表之前啟動了兩個事務,那么其中一個將被掛起,直到另一個完成。

SQL Server 文檔顯然不相關。

但是,是的,這看起來像是您應該報告的 PostgreSQL 錯誤。 但是請使用 SQL 腳本,而不是使用動畫 GIF...

暫無
暫無

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

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