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