數(shù)據(jù)庫的 ACID 屬性是什么意思?
我們說到數(shù)據(jù)庫的時(shí)候,常常提到其 ACID 屬性。那么 ACID 是什么意思呢?
ACID 是用來描述數(shù)據(jù)庫事務(wù)的屬性。反過來說,滿足 ACID 屬性的一系列數(shù)據(jù)庫操作被稱為事務(wù)。
下圖解釋了 ACID 在數(shù)據(jù)庫事務(wù)中的含義。
圖片
01 原子性(Atomicity)
事務(wù)中的寫操作是一次性執(zhí)行的,不能分解成更小的部分。如果在執(zhí)行事務(wù)時(shí)出現(xiàn)故障,同一個(gè)事務(wù)中的寫入將被回滾。應(yīng)用程序可以安全地重試同一事務(wù),而不會(huì)產(chǎn)生任何副作用。
因此,原子性意味著 "全有或全無"(All or Nothing)。
02 一致性(Consistency)
CAP 定理中的 "一致性 "是指每次讀取都會(huì)收到最近的寫入或錯(cuò)誤。與 CAP 定理不同的是,這里的一致性是指保留數(shù)據(jù)庫的不變性。事務(wù)寫入的任何數(shù)據(jù)都必須符合事先定義的規(guī)則,并保持?jǐn)?shù)據(jù)庫處于良好狀態(tài)。比如我們?cè)跀?shù)據(jù)庫中設(shè)置了 Trigger 用來更新關(guān)聯(lián)表,那么數(shù)據(jù)寫入后必須保證其正確執(zhí)行。
03 隔離(Isolation)
當(dāng)有來自兩個(gè)不同事務(wù)的并發(fā)寫入時(shí),這兩個(gè)事務(wù)是相互隔離的。最嚴(yán)格的隔離是 "序列化"(serializability),即每個(gè)事務(wù)運(yùn)行時(shí)都像數(shù)據(jù)庫中唯一運(yùn)行的事務(wù)一樣。然而,這在現(xiàn)實(shí)中很難實(shí)現(xiàn),所以我們通常采用較弱的隔離級(jí)別。
04 持久化(Durability)
事務(wù)提交后,即使系統(tǒng)發(fā)生故障,數(shù)據(jù)也會(huì)被持久化。數(shù)據(jù)庫會(huì)使用預(yù)寫日志(Write-Ahead Log)或類似機(jī)制來確保持久化。在分布式系統(tǒng)中,持久化意味著數(shù)據(jù)會(huì)復(fù)制到其他節(jié)點(diǎn)。
神書 DDIA (Designing Data Intensive Applications) 中關(guān)于 ACID 有幾點(diǎn)很好的見地,值得我們思考:
- 一致性其實(shí)是應(yīng)用程序的責(zé)任,而不是數(shù)據(jù)庫的職責(zé)范圍。應(yīng)用程序可以使用原子性和隔離來保證數(shù)據(jù)的一致性。而數(shù)據(jù)庫系統(tǒng)只能保證各種數(shù)據(jù)庫規(guī)則被執(zhí)行了。
- ACID 四個(gè)屬性中只有隔離是用來描述并發(fā)情況的,原子性并不描述并發(fā)情況。
- 各個(gè)弱隔離級(jí)別都會(huì)帶來一些限制,我們需要清楚其底層機(jī)制。