快照隔離(snapshot isolation,SI)是數據庫事務處理中的一個隔離級別,保證事務的讀操作將看到一個一致的數據庫的版本快照(實際上讀取比該事務早的最後一次提交值)。該事務的寫操作成功提交,僅當基於該快照的任何並發修改與該事務的修改沒有衝突(即寫-寫衝突)。

很多重要的數據庫管理系統已經採用了快照隔離,如InterBase, Firebird, Oracle, MySQL[1], PostgreSQL, SQL Anywhere英語Sql anywhere, MongoDB[2]Microsoft SQL Server (從2005)。原因是快照隔離比可串行性隔離級別的性能更好,且能避免絕大多數並發異常。快照隔離一般用多版本並發控制(MVCC)實現。 快照隔離避免了ISO SQL-92所列舉的並發異常現象,但不是SQL-92定義的無並發異常的可串行化

定義 編輯

事務在啟動時得到一個數據庫的版本號。事務結束時,成功提交僅當它修改的快照的數據項此時沒有被外界改變,即沒有寫-寫衝突英語write-write conflict,否則事務流產(abort)。

寫偏斜(write skew)異常,是指兩個事務(T1與T2)並發讀取一個數據集(例如包含 V1 與 V2),然後各自修改數據集中不相交的數據項(例如 T1 修改 V1, T2 修改 V2),最後並發提交事務。如果事務是串行執行,這種異常不會發生。而快照隔離允許這種異常發生。例如,設想 V1 與 V2是 Phil的個人銀行賬戶。銀行允許V1或V2是空頭賬戶,只要兩個賬戶總和非負(即 V1 + V2 ≥ 0). 兩個戶頭的初值各是 $100. Phil啟動兩個事務,T1從V1取出$200,T2從V2取出$200。

解決寫偏移異常的兩種策略:[3]

  • 實現寫寫衝突:增加要給專門的衝突表,兩個事務都修改它。
  • 提升:一個事務修改它的只讀數據行(替換其值為一個相等的值)從而導致一個寫-寫衝突,或者使用等價的提升:SELECT FOR UPDATE語句。

在上述例子中,可以重建一個表,記錄每個儲戶與其總金額。但這種方法違背了數據庫範式。另一種方式把一個事務的讀數據提升為寫數據,如T2做V1 = V1。但這種操作不總是可能的。

歷史 編輯

快照隔離源自多版本並發控制數據庫。[4] InterBase(後來被Borland所有),從1985年版本4開始提供了不是真正的可串行化的SI[4][5],並帶有寫偏移異常。

ANSI SQL-92標準基於數據庫鎖機制,對MVCC系統缺乏認識。[4]

2008年Cahill等人的論文指出寫偏斜異常可通過檢測並流產危險的並發任務群解決。[6]已經被PostgreSQL 9.1採用[7][8][9] 這被稱作"Serializable Snapshot Isolation", SSI.

2011, Jimenez-Peris等人申報專利[10]可以解決每秒上千萬次事務提交的快照隔離,成為超大規模並發數據庫引擎LeanXcale的基礎 [11]. 2010成為CumuloNimbo European Project的部分 [12].

參考文獻 編輯

  1. ^ MySQL :: MySQL 8.0 Reference Manual :: 15.5.2.3 Consistent Nonlocking Reads. dev.mysql.com. [2018-08-27]. (原始內容存檔於2021-03-08) (英語). 
  2. ^ Multiversion concurrency control in MongoDB, MongoDB CTO: How our new WiredTiger storage engine will earn its stripes頁面存檔備份,存於互聯網檔案館
  3. ^ Fekete, Alan; Liarokapis, Dimitrios; O'Neil, Elizabeth; O'Neil, Patrick; Shasha, Dennis, Making Snapshot Isolation Serializable, ACM Transactions on Database Systems, 2005, 30 (2): 492–528, CiteSeerX 10.1.1.503.3169 , ISSN 0362-5915, doi:10.1145/1071610.1071615 
  4. ^ 4.0 4.1 4.2 引用錯誤:沒有為名為berenson的參考文獻提供內容
  5. ^ Stuntz, Craig. Multiversion Concurrency Control Before InterBase. [October 30, 2014]. (原始內容存檔於2007-10-23). 
  6. ^ Michael J. Cahill, Uwe Röhm, Alan D. Fekete (2008) "Serializable isolation for snapshot databases", Proceedings of the 2008 ACM SIGMOD international conference on Management of data, pp. 729–738, ISBN 978-1-60558-102-6 (SIGMOD 2008 best paper award)
  7. ^ 引用錯誤:沒有為名為psql91release的參考文獻提供內容
  8. ^ 引用錯誤:沒有為名為postgresdocs91的參考文獻提供內容
  9. ^ Ports, Dan R. K.; Grittner, Kevin. Serializable Snapshot Isolation in PostgreSQL (PDF). Proceedings of the VLDB Endowment. 2012, 5 (12): 1850–1861 [2018-11-12]. arXiv:1208.4179 . doi:10.14778/2367502.2367523. (原始內容存檔 (PDF)於2012-11-14). 
  10. ^ [1],JIMÉNEZ-PERIS, Ricardo & Marta PATIÑO-MARTINEZ,「System and method for highly scalable decentralized and low contention transactional processing」 
  11. ^ LeanXcale. leanxcale.com. [2017-08-20]. (原始內容存檔於2020-11-01) (美國英語). 
  12. ^ Jimenez-Peris, Ricardo; Patiño-Martinez, Marta; Magoutis, Kostas; Bilas, Angelos; Brondino, Ivan. CumuloNimbo: A Highly-Scalable Transaction Processing Platform as a Service. ERCIM NEWS. April 2012 [2018-11-12]. (原始內容存檔於2020-12-30). 

進一步閱讀 編輯