大部分關聯式資料庫並不真的支援ACID

banq發表於2015-06-28
大部分關聯式資料庫宣稱與NoSQL的區別是100%支援ACID事務,在現實中,很少有關聯式資料庫包括Oracle能提供正式的ACID保證,即使他們宣傳自己是提供真正ACID。

那麼,誰在撒謊呢?

來自2013年文章When is "ACID" ACID? Rarely. | Peter Bailis認為:

ACID的教科書正式定義隔離是序列化serializability ,即執行一組事務的結果應該相當於這些事務的序列執行,這就意味著每個運算元據庫的事務好像只有它們自己一樣,這能確保資料庫的正確性和一致性,帶有序列化的資料庫(ACID中I)提供了任意讀寫事務並且確保一致性(ACID中的C)或正確性,沒有序列化,ACID(特別是一致性)將無法得到保證。

大部分提供ACID的資料庫並不提供序列化,作者在文章中列出了18種資料庫中預設的只有三個提供序列化(default isolation列),只有9個將序列化作為選項提供(Maximum Isolation列):

[img index=1]
圖中標註S的表示提供序列化,RC表示read committed; RR表示repeatable read等。

這些關聯式資料庫預設並沒有提供序列化,取而代之的是幾個弱變種,對於一個資料庫來說,沒有理由不支援序列化,我們已經擁有很好的演算法,我們也已經在ACID可擴充套件伸縮方面取得飛躍進步,那麼預設為什麼不提供序列化呢?

一個關鍵原因是效能,序列化隔離級別會限制併發,傳統技術如兩段鎖2PC相比代價又非常昂貴,另外,想同時獲得高可用性和序列化又是不可能的(這些關聯式資料庫即使透過它們現在的弱模型也不能提供高可用性),第三個預設不提供序列化的理由是在弱模型(相對序列化隔離級別低一些的隔離級別)下事務也降低了衝突機率,不太會死鎖。但是,這些好處並不是免費的,在這種弱模型下一致性異常還是不斷呈現上升趨勢。

[該貼被admin於2015-06-28 21:09修改過]

相關文章