選單

postgres資料庫的假陽性

在可序列化模式下,因為永遠不會檢測到假陰性(發生異常但未檢測到)序列化異常, PostgreSQL能始終完全保證併發事務的可序列性。

但是在某些情況下,可能會檢測到假陽性異常(沒有發生異常但誤報發生),使用者在使用 SERIALIZABLE 模式時應牢記這一點。

postgres資料庫的假陽性

發生假陽性序列化異常的場景

當使用順序掃描時,PostgreSQL建立了一個關係級的SIREAD鎖。

PostgreSQL使用順序掃描時的SIREAD鎖和讀-寫衝突。在這種情況下,產生了與tbl表上SIREAD鎖相關聯的讀-寫衝突:C1和C2,它們在前趨圖中構成了一個環。因此會檢測到假陽性的寫偏差異常。雖然實際上沒有衝突,但是Tx_A與Tx_B兩者之一也將被中止。

postgres資料庫的假陽性

即使使用索引掃描,如果事務Tx_A和Tx_B都獲取了相同的索引SIREAD鎖,PostgreSQL也會誤報假陽性異常。

假設索引頁Pkey_1包含兩條索引項,其中一條指向Tuple_1,另一條指向Tuple_2。當Tx_A和Tx_B執行相應的SELECT和UPDATE命令時,Pkey_1同時被Tx_A和Tx_B讀取與寫入。這時候會產生與Pkey_1相關聯的讀-寫衝突:C1和C2,並在前趨圖中構成一個環,因而檢測到假陽性寫偏差異常。如果Tx_A和Tx_B獲取不同索引頁上的SIREAD鎖,則不會誤報,並且兩個事務都可以提交。

postgres資料庫的假陽性