事務的ACID是指什么?


事務的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 不允許 不允許 不允許 不允許 不允許

需要說明的是,事務隔離級別和數據訪問的並發性是對立的,事務隔離級別越高並發性就越差。所以要根據具體的應用來確定合適的事務隔離級別,這個地方沒有萬能的原則。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM