1. 程式人生 > >資料庫事務的四大特性

資料庫事務的四大特性

  

MySQL資料庫的InnoDB儲存引擎是支援事務的引擎,其預設事務隔離級別為REPEATABLE READ(簡稱RR)。ANSI SQL標準下RR事務隔離級別是Degree 2.9999的隔離性,但是與ANSI SQL標準不同的是,InnoDB儲存引擎在RR的事務隔離級別下就解決了幻讀問題,從而實現Degree 3的隔離性要求,從而達到了真正隔離性的要求。對比其他資料庫,要達到真正的事務隔離性要求,必須將事務隔離級別設定為SERIALIZABLE。換句話說,MySQL InnoDB的預設事務隔離級別可以理解為其他資料庫的SERIABLIZABLE級別。

然而,從嚴格意義上來說,InnoDB的RR事務隔離級別的實現與傳統的SERIALIAZABLE事務隔離級別還是有些不一樣,這導致在某些特定場景下會給使用者有錯愕抑或不能接受的感覺,比如唯一索引列在一個事務中允許重複值存在。不過這並不會破壞事務的一致性,只要理解InnoDB儲存引擎的鎖與MVCC的實現,其實有些怪異的現象都好理解。

SNAPSHOT事務隔離級別

經典的SERIALIAZABLE事務隔離級別採用嚴格的兩階段鎖(strict two-phrase lock,簡稱:STPL)實現,這也是Jim Gray在書中提及的方法。但是由於讀寫都需要上鎖,這樣導致在大部分情況下事務的效能都不如類似RC(READ COMMITTED)這樣的事務隔離級別。

為了解決效能問題,最近越來越多的資料庫開始支援SNAPSHOT事務隔離級別(簡稱SI),如Oracle、PostgreSQL、Microsoft SQL Server資料庫等。SI事務隔離級別貌似解決了Dirty Read、Unrepeatable Read和Phantom Read問題。可惜的是,其依然不符合真正隔離性的要求,其存在write skew的異常問題。2008年的SIGMOD大會上,有人提出了Serializable Snapshot Isolation(SSI),從而解決了之前SI事務隔離級別存在的問題。PostgreSQL9.1版本在此論文基礎上實現了SSI事務隔離級別並做了相應的優化。此外,在2012年的VLDB大會上PostgreSQL釋出了相應的論文,有興趣的讀者可以繼續研究。

基於快照的事務隔離級別(不論SI還是SSI)效能較之經典的SERIALIZABLE事務隔離級別提升非常多,但其存在兩個問題不容忽視。一是其會導致“錯誤”的回滾,因為其策略就是保證正確,雖然有時可能會誤殺一些沒有問題的事務。二是對於大事務的支援需要額外的記憶體保證,如果修改的資料量特別大,那麼這可能會導致記憶體溢位的問題發生。但不論怎麼說,SSI可能都是未來的一個預設事務隔離級別發展的方向。期待MySQL資料庫也能儘快支援。