分散式事務?咱先弄明白本地事務再說 - ACID

過去一段時間面試的同學,對於資料庫事務,可以按照配置正常使用,但很多都無法講清楚和理解資料庫事務這個東西真正的意義,以及網際網路興起以後,當今資料庫在ACID面前面臨怎樣的問題和抉擇。
事務,是各大單機SQL資料庫廠商包括Oracle、IBM DB2等,早在上世紀80年代提出的一個解決 資料併發操作處理的模型 ,旨在滿足多使用者(多執行緒、程序)對資料操作的場景下,依然能保證邏輯正確執行,狀體持久,且各大廠商提出,並在事務實現上都遵循事務的 ACID 4個特性。
回顧ACID

一個模組,是多個獨立的功能邏輯的組合,每個功能包含多個操作步驟,包括IO、計算、資料庫等操作,必須保證每一步都被執行,且執行正確,這個功能和模組才是可用,可交付的。

那麼,如何保證這些操作的完整性,就是Atomic,定義為一個原子操作,全部執行且成功,或者全部失敗都不執行(回滾),原子操作如果成功,那狀態就必須持久,被稱為資料庫的Durability,永續性。
原子性A、永續性D,這倆個都比較好理解,定義了事務的邊界,行為的開始和行為的結束。
A、D定義了事務的邊界,那一致性C、隔離性I,就是對事務中間狀態的管理,
一致性,也可以理解為是資料的完整性,資料的有效性,我們舉例來說明什麼是一致性,以及事務是如何保證一致性的,
- 一個賬戶減100,另一個賬戶加100的時候,程式異常crash了,這時候就出現資料的不一致情況,破壞了有效性,這個問題可以由Atomic來保證;
- 一個原子操作在執行的過程中,涉及多個數據變更的中間狀態的保護,例如把A賬戶減100,在加到B賬戶完成這個原子操作之前,此時,其他執行緒對A讀的操作就有可能獲取到A少100的這個中間狀態,這種情況是否允許發生,由Isolation來保證;
- 資料庫延遲約束,例如資料欄位的型別、空值、關係、資料範圍、主鍵唯一性等這些合法性的檢查都是由Durability來保證,在事務commit時,發現數據不合法,是無法提交成功的。
所以,綜上所述,一致性C,是資料狀態的正確變換的保證,AID,是實現C的手段,也是我們真正要追求的目標。
而,隔離性I的設定,就是對一致性C不同程度的破壞,事實上,如果我們順序對資料進行讀寫,ACD是完全可用保證的,但這樣效率會非常的低下,那,我們是要嚴格的一致性,還是更高的效率,資料庫專家們把這個決定權交給了使用者,所以,我們看到,ACID當中,只有隔離性I是使用者可以選擇的,可以自定義的。
隔離性包括 序列讀、讀已提交、重複讀、讀未提交
等幾種策略,效能由低到高,讓使用者在不同的使用場景,選擇合適的隔離策略,在一致性和效能之間平衡,取得最好的綜合表現。
小結
本文主要介紹了事務和事務的幾個特性,解釋了ACID的由來和之間的關係,
總的來說,ACID的核心是C,大家其實都是為得到C而提出的不同緯度的限制和規範,A確定一個功能的完整性,D對狀態負責,I可以說是C的等級係數,不同的I的策略,會出現不同的級別的C,AID是資料庫本身的功能特性,C由業務層把控,要嚴格的C,就設定完整的資料庫約束和序列隔離,反之,要寬鬆的C,就放開資料庫的約束,使用讀未提交的隔離策略,存在即合理,後者更適用於網際網路高併發對一致性要求不高的場景,例如分散式的AP系統,可以保證服務整體的響應時間和服務的可用性。