Jepsen發現PostgreSQL重大Bug:在單個PostgreSQL例項上以可序列化隔離執行的事務實際上是不可序列的
PostgreSQL是一個眾所周知的關聯式資料庫系統。我們使用Jepsen的新事務隔離檢查器Elle評估了PostgreSQL ,發現在單個PostgreSQL例項上以可序列化serializability隔離執行的事務實際上是不可序列化的。
在正常操作下,事務有時可能會顯示G2項:這是涉及一組事務的異常(大致而言),它們相互之間無法觀察到彼此的寫操作。
此外,我們在PostgreSQL“可重複讀取”下發現了G2-item的頻繁例項,這是由可重複讀取的常見形式正式禁止的。正如Martin Kleppmann先前報導的那樣,這是由於PostgreSQL的“可重複讀取”實際上是快照隔離。
由於長期討論ANSI SQL標準中的歧義,因此可以允許這種行為,但是對於熟悉該文獻的使用者來說,這可能是令人驚訝的。我們在8月13日釋出了下一個次要版本的可序列化性錯誤修補程式,可通過文件輕鬆解決G2項在可重複讀取下的存在。這項工作是獨立進行的,沒有任何補償,並且是根據Jepsen道德政策執行的。
建議
使用者應注意,PostgreSQL的“可重複讀取”實際上是快照隔離,這在PostgreSQL社群中早已為人所知,並且先前由Kleppmann報告。由於在可重複讀取的常見形式化中禁止使用G2項,因此使用者可能已經設計了應用程式,而這對於PostgreSQL而言是正確的。在這種情況下,使用者可能希望改為在可序列化隔離下執行選定的事務,新增顯式鎖定或重新設計這些事務,以使它們不再對G2項敏感。
我們建議PostgreSQL團隊更新其併發控制文件,以解決圍繞“可重複讀取”的歧義。在當前文件中沒有提到的術語“快照隔離” -stating是PostgreSQL的“可重複讀”,其實就是快照隔離會立即澄清事實。通過用G-single,G2-item和G2代替模稜兩可的“序列化異常”,文件還可以為使用者提供更清晰的指導;SI禁止使用單G,但允許G2和G2。
關於快照隔離是否比可重複讀取強,一種可能的解決方案是採用Berenson等人的定義,這樣做將使PostgreSQL與Berenson,Adya,Bailis等人在事務隔離方面的25年學術獎學金保持[url=https://www.vldb.org/pvldb/vol7/p181-bailis.pdf]一致[/url]。
似乎沒有PostgreSQL版本可以保證可序列化。使用者應注意,併發更新和插入事務可能會出現G2專案。高爭用的工作負載尤其容易受到影響。PostgreSQL團隊已經編寫了測試來重現該問題,並正在評估補丁。我們建議在下一個次要版本可用時進行升級。
點選標題見原文詳細分析。
相關文章
- PostgreSQL事務隔離級別SQL
- 事務可見性的判斷和事務隔離級別,PostgreSQL和MySQL實現上有啥區別MySql
- 怎樣在 Kubernetes 上執行 PostgreSQLSQL
- Docker 教程:在 Mac M2 上執行 PostgreSQLDockerMacSQL
- PostgreSQL DBA(23) - MVCC#3(事務快照和隔離級別)SQLMVCC#
- Postgresql 的預設隔離級別SQL
- 在 RHEL 或 CentOS 上使用 Patroni 部署 PostgreSQL 以實現高可用性CentOSSQL
- MySQL資料庫事務隔離性的實現MySql資料庫
- 線上的分散式事務是什麼樣的?以python的saga為例分散式Python
- Oracle vs PostgreSQL,研發注意事項(6)- 事務處理OracleSQL
- PostgreSQL 併發控制機制(4):RR隔離級別,MySQL vs PostgreSQLMySql
- PostgreSQL:事務SQL
- MySQL 事務隔離級別實現原理MySql
- 事務隔離(二):基於加鎖方式的事務隔離原理
- Java:對一個物件序列化和反序列化的簡單實現Java物件
- 「在 Kubernetes 上執行 Pgpool-Il」實現 PostgreSQL 查詢(讀)負載均衡和連線池SQL負載
- 事務隔離
- MySQL的事務隔離級別是什麼?MySql
- PostgreSQL 併發控制機制(1):隔離級別SQL
- Spring的事務管理(一) Spring事務管理的實現,事務的屬性(隔離級別,傳播行為,只讀)Spring
- MySQL事務(二)事務隔離的實現原理:一致性讀MySql
- Spring系列之事務的控制 註解實現+xml實現+事務的隔離等級SpringXML
- LightDB/PostgreSQL 生成可重複執行的指令碼SQL指令碼
- Oracle vs PostgreSQL,研發注意事項(2)-DDL語句與事務OracleSQL
- 啥是 MySQL 事務隔離級別?MySql
- MySQL事務的隔離級別MySql
- MySQL的事務隔離級別MySql
- MySQL事務隔離MySql
- MySQL 事務隔離MySql
- 深入理解MySQL中事務隔離級別的實現原理MySql
- 一文搞懂MySQL事務的隔離性如何實現|MVCCMySqlMVC
- Postgresql在ubuntu 22.04上遭遇OOM的處理方法SQLUbuntuOOM
- 關於事務、事務的隔離級別以及對髒讀、不可重複讀、幻讀的理解
- MySQL的事務預設隔離級別是什麼MySql
- 什麼是Java序列化?如何實現序列化?Java
- MySQL 事務隔離實驗-認識:髒讀、不可重複讀、幻讀MySql
- 序列化和反序列化的底層實現原理是什麼?
- Oracle vs PostgreSQL,研發注意事項(3)- 事務回滾之UPDATE操作解析OracleSQL