事務的ACID是指什么?
答:
- 原子性(Atomic):事務中各項操作,要么全做要么全不做,任何一項操作的失敗都會導致整個事務的失敗;
- 一致性(Consistent):事務結束后系統狀態是一致的;
- 隔離性(Isolated):並發執行的事務彼此無法看到對方的中間狀態;
- 持久性(Durable):事務完成后所做的改動都會被持久化,即使發生災難性的失敗。通過日志和同步備份可以在故障發生后重建數據。
補充:關於事務,在面試中被問到的概率是很高的,可以問的問題也是很多的。首先需要知道的是,只有存在並發數據訪問時才需要事務。當多個事務訪問同一數據時,可能會存在5類問題,包括3類數據讀取問題(臟讀、不可重復讀和幻讀)和2類數據更新問題(第1類丟失更新和第2類丟失更新)。
臟讀(Dirty Read):A事務讀取B事務尚未提交的數據並在此基礎上操作,而B事務執行回滾,那么A讀取到的數據就是臟數據。
時間 | 轉賬事務A | 取款事務B |
---|---|---|
T1 | 開始事務 | |
T2 | 開始事務 | |
T3 | 查詢賬戶余額為1000元 | |
T4 | 取出500元余額修改為500元 | |
T5 | 查詢賬戶余額為500元(臟讀) | |
T6 | 撤銷事務余額恢復為1000元 | |
T7 | 匯入100元把余額修改為600元 | |
T8 | 提交事務 |
不可重復讀(Unrepeatable Read):事務A重新讀取前面讀取過的數據,發現該數據已經被另一個已提交的事務B修改過了。
時間 | 轉賬事務A | 取款事務B |
---|---|---|
T1 | 開始事務 | |
T2 | 開始事務 | |
T3 | 查詢賬戶余額為1000元 | |
T4 | 查詢賬戶余額為1000元 | |
T5 | 取出100元修改余額為900元 | |
T6 | 提交事務 | |
T7 | 查詢賬戶余額為900元(不可重復讀) |
幻讀(Phantom Read):事務A重新執行一個查詢,返回一系列符合查詢條件的行,發現其中插入了被事務B提交的行。
時間 | 統計金額事務A | 轉賬事務B |
---|---|---|
T1 | 開始事務 | |
T2 | 開始事務 | |
T3 | 統計總存款為10000元 | |
T4 | 新增一個存款賬戶存入100元 | |
T5 | 提交事務 | |
T6 | 再次統計總存款為10100元(幻讀) |
第1類丟失更新:事務A撤銷時,把已經提交的事務B的更新數據覆蓋了。
時間 | 取款事務A | 轉賬事務B |
---|---|---|
T1 | 開始事務 | |
T2 | 開始事務 | |
T3 | 查詢賬戶余額為1000元 | |
T4 | 查詢賬戶余額為1000元 | |
T5 | 匯入100元修改余額為1100元 | |
T6 | 提交事務 | |
T7 | 取出100元將余額修改為900元 | |
T8 | 撤銷事務 | |
T9 | 余額恢復為1000元(丟失更新) |
第2類丟失更新:事務A覆蓋事務B已經提交的數據,造成事務B所做的操作丟失。
時間 | 轉賬事務A | 取款事務B |
---|---|---|
T1 | 開始事務 | |
T2 | 開始事務 | |
T3 | 查詢賬戶余額為1000元 | |
T4 | 查詢賬戶余額為1000元 | |
T5 | 取出100元將余額修改為900元 | |
T6 | 提交事務 | |
T7 | 匯入100元將余額修改為1100元 | |
T8 | 提交事務 | |
T9 | 查詢賬戶余額為1100元(丟失更新) |
數據並發訪問所產生的問題,在有些場景下可能是允許的,但是有些場景下可能就是致命的,數據庫通常會通過鎖機制來解決數據並發訪問問題,按鎖定對象不同可以分為表級鎖和行級鎖;按並發事務鎖定關系可以分為共享鎖和獨占鎖,具體的內容大家可以自行查閱資料進行了解。
直接使用鎖是非常麻煩的,為此數據庫為用戶提供了自動鎖機制,只要用戶指定會話的事務隔離級別,數據庫就會通過分析SQL語句然后為事務訪問的資源加上合適的鎖,此外,數據庫還會維護這些鎖通過各種手段提高系統的性能,這些對用戶來說都是透明的(就是說你不用理解,事實上我確實也不知道)。ANSI/ISO SQL 92標准定義了4個等級的事務隔離級別,如下表所示:
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 | 第一類丟失更新 | 第二類丟失更新 |
---|---|---|---|---|---|
READ UNCOMMITED | 允許 | 允許 | 允許 | 不允許 | 允許 |
READ COMMITTED | 不允許 | 允許 | 允許 | 不允許 | 允許 |
REPEATABLE READ | 不允許 | 不允許 | 允許 | 不允許 | 不允許 |
SERIALIZABLE | 不允許 | 不允許 | 不允許 | 不允許 | 不允許 |
需要說明的是,事務隔離級別和數據訪問的並發性是對立的,事務隔離級別越高並發性就越差。所以要根據具體的應用來確定合適的事務隔離級別,這個地方沒有萬能的原則。