數據庫事務的四大特性&事務隔離級別介紹

事務概念:事務是指的滿足ACID特性的一系列操作。
四大特性(ACID)介紹如下:

  • 原子性(Atomicity): 事務被視爲不可分割的最小單元,要麼全部提交成功,要不都失敗回滾到最初狀態。
  • 一致性(Consistency):一般的一致性分爲強一致性、弱一致性以及最終一致性,不同的一致性級別實現起來的難度不一樣,最好的當然是強一致性。
  • 持久性(Durability):一旦事務提交,對事務所做過的所有修改將會永久保存到數據庫中,即便數據庫系統遇到故障也不會丟失提交過的數據操作。
  • 隔離性(Isolation):數據庫中可能同一時間會有多個事務執行,多個事務之間就必須要互相不影響指的就是隔離性。

  隔離性可以分爲多種,在介紹不同隔離級別前,先了解如果沒有隔離性的情況下,在併發的時候,數據庫會出現哪些問題,主要會出現髒讀、不可重複讀、幻讀的問題。

  • 髒讀:事務A修改了數據d,但是事務A還沒執行完畢提交,然後此時事務B讀取到數據d,此時讀取到事務A修改過的數據d,然後事務A可能後續處理異常,然後回滾把對d的修改給撤回了,此時B已經讀取到了事務A修改後的數據,所以B中的數據d是異常數據,這個過程就是髒讀。
  • 不可重複讀:事務A在執行過程中,涉及到多次讀取某一條數據,假設A第一次讀取數據d,過了一會兒再來讀取d,而這個過程中又有事務B對數據進行修改並提交,所以就會導致A讀取到B提交後的數據,導致A讀取到的d的數據兩次是不一樣的。
  • 幻讀:事務A多次讀取某個範圍內的數據(例如select * from t where age>10 and age <20),這種範圍讀取數據的時候,第一次可能查到十條數據,然後過了一會兒第二次查詢可能查到十一條數據,這多出的一條可能就是因爲有個事務B在這期間插入了一條數據,導致A第二次查詢的時候得到的結果不一樣,這就是所謂的幻讀。

爲了解決以上問題,指定了不同的事務隔離級別,最好的當然是以上全部現象都能杜絕,但是針對不同系統業務的需求以及性能要求,可能不需要嚴格滿足所有情況下的安全問題,所以不同的事務隔離級別就可以解決這個問題,這裏的隔離級別主要有:

  1. 未提交讀(Read Uncommitted):這種其實算是沒有隔離的,就是事務中只要修改的內容,即便沒有提交,對其它事務也是可見的。
  2. 提交讀(Read Commited):一個事務所做的修改,只有提交之後纔會對其它事務可見。即加入事務A修改了數據d1/d2/d3,則只要它沒有最後提交修改,那麼事務B在讀取d1/d2/d3的數據的時候都只能讀取到沒有修改的數據,只有事務A提交後,事務B才能讀取到A修改的內容。
  3. 可重複讀(Repeatable Read):保證在同一個事務中多次讀取同樣數據的時候保證兩次讀取到的數據是一樣的。
  4. 可串行化(Serializable):最高級別的隔離級別,這種情況下所有事務串行處理,所以任何併發導致的問題都不是問題了,但是這種級別的性能肯定是有很大損失的。

對於MySQL而言,默認的事務隔離級別是RR(可重複讀)!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章