NOSQL數(shù)據(jù)庫能否符合ACID特性?
必須重新理解ACID作為事務(wù)系統(tǒng)屬性的含義,而不管底層數(shù)據(jù)模型如何。
譯自Can NoSQL Databases Be ACID Compliant?,作者 Srinivasan Seshadri。
ACID特性概念傳統(tǒng)上與關(guān)系型數(shù)據(jù)庫相關(guān)聯(lián),導(dǎo)致對(duì)其在NoSQL系統(tǒng)中適用性的誤解。一些知名網(wǎng)站,例如AWS,斷言NoSQL無法符合ACID特性。與這些觀點(diǎn)相反,ACID(原子性、一致性、隔離性、持久性)并非關(guān)系型數(shù)據(jù)庫所獨(dú)有,而是事務(wù)處理系統(tǒng)的基石。
讓我們探討這些誤解以及為什么NoSQL數(shù)據(jù)庫能夠——而且經(jīng)?!袷谹CID特性。
早期的NoSQL系統(tǒng)優(yōu)先考慮性能和可用性,經(jīng)常放松ACID保證,這導(dǎo)致了NoSQL本質(zhì)上不符合ACID特性的認(rèn)知。
另一個(gè)重要的混淆來源在于對(duì)ACID中“C”(一致性)的解釋。許多人錯(cuò)誤地認(rèn)為它要求引用完整性約束,而NoSQL數(shù)據(jù)庫通常不支持這一點(diǎn)。然而,ACID的一致性概念更廣泛,并不固有地要求引用完整性,允許NoSQL數(shù)據(jù)庫在適當(dāng)?shù)那闆r下實(shí)現(xiàn)ACID一致性。
ACID的起源
原子性、一致性和持久性屬性是由Jim Gray在其關(guān)于事務(wù)的開創(chuàng)性論文中提出的。雖然ACID首字母縮略詞后來才出現(xiàn),但基本概念起源于Gray對(duì)事務(wù)處理的討論。值得注意的是,Gray對(duì)一致性的定義并不依賴于關(guān)系型數(shù)據(jù)庫特有的引用完整性約束。相反,它包含一個(gè)更廣泛的概念:
“事務(wù)是對(duì)狀態(tài)的轉(zhuǎn)換,具有原子性(全部或無)、持久性(效果能夠在故障后存活)和一致性(正確的轉(zhuǎn)換)的特性。”
Jim Gray和Andreas Reuter后來這樣定義一致性:
“事務(wù)是對(duì)狀態(tài)的正確轉(zhuǎn)換。作為一個(gè)組采取的行動(dòng)不會(huì)違反與狀態(tài)相關(guān)的任何完整性約束。這要求事務(wù)是一個(gè)正確的程序?!?/span>
這突出表明,ACID是一個(gè)用于確保事務(wù)處理系統(tǒng)(無論是否為關(guān)系型)正確性和可靠性的框架。
事務(wù)處理系統(tǒng):更廣泛的背景
此外,Gray和Reuter將事務(wù)處理系統(tǒng)定義為:
“事務(wù)處理系統(tǒng)(TP系統(tǒng))管理與數(shù)據(jù)庫交互以表示和操作現(xiàn)實(shí)世界狀態(tài)的應(yīng)用程序。它們通常支持分布式、具有嚴(yán)格可用性和性能要求的異構(gòu)環(huán)境。歷史上,TP系統(tǒng)開創(chuàng)了諸如容錯(cuò)存儲(chǔ)、分布式計(jì)算以及最值得注意的是ACID特性等概念?!?/span>
甚至在關(guān)系型系統(tǒng)之前,例如IBM在20世紀(jì)70年代的信息管理系統(tǒng)(IMS),就已經(jīng)支持ACID事務(wù),遠(yuǎn)在該首字母縮略詞被創(chuàng)造出來之前。
ACID特性:分層視角
ACID一致性可以理解為數(shù)據(jù)庫系統(tǒng)內(nèi)各個(gè)層提供的一組保證:
層級(jí) | 用途 |
查詢層 | 支持 SQL、Cypher、Gremlin、GQL 等查詢語言 |
事務(wù)層 | 為操作多條記錄或鍵值對(duì)提供事務(wù)保證 |
復(fù)制層 | 在多個(gè)節(jié)點(diǎn)之間提供一致的副本復(fù)制 |
二級(jí)索引層 | 為節(jié)點(diǎn)上存儲(chǔ)的記錄提供二級(jí)索引 |
存儲(chǔ)層 | 在節(jié)點(diǎn)上存儲(chǔ)記錄或鍵值對(duì) |
這些層說明ACID一致性是整個(gè)數(shù)據(jù)庫系統(tǒng)協(xié)調(diào)保證的結(jié)果。特別是,這些保證是由查詢語言或數(shù)據(jù)模型層以下的層提供的,這些層可以通過引入更多關(guān)于該數(shù)據(jù)庫系統(tǒng)必須確保的完整性約束的概念來增加ACID保證。
一致性:ACID與CAP
一個(gè)常見的混淆來源是ACID和CAP(一致性、可用性、分區(qū)容忍性)中“一致性”一詞的雙重使用。在ACID中,一致性指的是事務(wù)狀態(tài)轉(zhuǎn)換相對(duì)于用戶定義約束(例如主鍵、引用完整性)的正確性。在CAP中,一致性表示分布式系統(tǒng)中副本之間的數(shù)據(jù)一致性。
請(qǐng)注意:
- 在嚴(yán)格串行化隔離級(jí)別下運(yùn)行的符合ACID特性的分布式數(shù)據(jù)庫固有地滿足CAP的一致性(線性化)要求。
- 缺乏CAP一致性(線性化)意味著未能滿足ACID的原子性和嚴(yán)格串行化隔離保證。
BASE與ACID的二分法
BASE(基本可用,軟狀態(tài),最終一致性)理念隨著NoSQL數(shù)據(jù)庫的出現(xiàn)而出現(xiàn),以解決Web應(yīng)用程序的可擴(kuò)展性需求。早期的NoSQL系統(tǒng)優(yōu)先考慮可用性和分區(qū)容錯(cuò)性,通常會(huì)放寬ACID保證。這種區(qū)別導(dǎo)致了一種誤解,即NoSQL數(shù)據(jù)庫無法實(shí)現(xiàn)ACID一致性。
然而,NoSQL系統(tǒng)的發(fā)展模糊了這些界限。許多現(xiàn)代NoSQL數(shù)據(jù)庫現(xiàn)在支持:
- 強(qiáng)一致性模型(CAP中的C)
- 具有串行化保證的事務(wù)(ACID中的A、I和D)
- 主鍵等約束的強(qiáng)制執(zhí)行
NoSQL系統(tǒng)中的ACID一致性
一些NoSQL數(shù)據(jù)庫聲稱具有ACID一致性,并有強(qiáng)大的技術(shù)實(shí)現(xiàn)作為支撐。但是,請(qǐng)注意,并非所有這些系統(tǒng)都可以在嚴(yán)格的串行化隔離級(jí)別運(yùn)行。例如:
- DynamoDB:根據(jù)AWS,“DynamoDB支持原子性、一致性、隔離性和持久性(ACID)事務(wù),從而能夠跨表內(nèi)和跨表中的多個(gè)項(xiàng)目實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯?!?提供具有嚴(yán)格ACID保證的多文檔事務(wù)。
- MongoDB提供具有嚴(yán)格 ACID 保證的多文檔事務(wù)。
- Aerospike:將在2025年初的8.0服務(wù)器版本中發(fā)布對(duì)嚴(yán)格可串行化ACID事務(wù)的支持。
- Databricks的Delta Lake:在分布式對(duì)象存儲(chǔ)上提供ACID兼容的表存儲(chǔ)。
這些例子表明,NoSQL數(shù)據(jù)庫能夠并且確實(shí)實(shí)現(xiàn)了ACID一致性,這使得它們適合于關(guān)鍵任務(wù)應(yīng)用程序。
結(jié)論
ACID不是關(guān)系數(shù)據(jù)庫的遺留物,而是事務(wù)處理系統(tǒng)中的一個(gè)基礎(chǔ)概念?,F(xiàn)代NoSQL數(shù)據(jù)庫已經(jīng)發(fā)展到包含ACID保證,挑戰(zhàn)了它們天生就是“BASE”的過時(shí)說法。隨著數(shù)據(jù)庫生態(tài)系統(tǒng)的不斷創(chuàng)新,必須重新定義我們對(duì)ACID的理解,將其視為事務(wù)系統(tǒng)的屬性,而不管底層數(shù)據(jù)模型如何。
通過消除這些誤解,我們可以更好地理解NoSQL數(shù)據(jù)庫在為各種應(yīng)用程序提供可靠、一致和可擴(kuò)展的解決方案方面的能力。