1. 程式人生 > >高效能mysql_事務及4種隔離級別

高效能mysql_事務及4種隔離級別

轉自 高效能mysql

【1.3】事務

1)事務定義:事務就是一組原子性的sql查詢,或者說一個獨立的工作單元。

即事務內的sql語句,要麼全部執行成功,要麼全部執行失敗;

2)事務的ACID概念:原子性automicity,一致性consistency,隔離性isolation,永續性durability;

  • 原子性:一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾;
  • 一致性;資料庫總是從一個一致性狀態轉移到另一個一致性狀態;
  • 隔離性:通常來說,一個事務所做的修改在最終提交前,對其他事務都是不可見的;
  • 永續性:一旦事務提交,則其所做的修改就會永久儲存到資料庫中;此時即使資料庫崩潰,資料也不會丟失;

 

【1.3.1】4種隔離級別

級別1)READ UNCOMMITED 未提交讀:事務的修改,即使沒有提交,對其他事務也是可見的;

級別2)READ COMMITTED 提交讀:一個事務從開始直到提交之前,所做的任何修改對其他事務不可見的;

也叫不可重複讀,因為兩次執行相同的查詢,可能得到不同的查詢結果;

 

級別3)REPEATABLE READ 可重複讀:RR 解決了髒讀問題。該級別保證在同一事務中多次讀取同樣記錄的結果是一致的 ;(mysql的預設事務隔離級別)

但 RR 無法解決幻讀問題,幻讀指的是當某個事物在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了一條新的記錄,當之前的事務再次讀取到該範圍的記錄時,會產生幻行;

不過 mysql中的 innodb 和 XtraDB 儲存引擎通過多版本併發控制 MVVC(multiversion concurrency control) 解決了幻讀問題;

 

級別4)SERIALIZABLE 可序列化:最高隔離級別。通過強制事務序列執行,避免了前面說的幻讀問題。

簡單說,SERIALIZABLE 會在讀取的每一行資料上都加鎖,所以可能導致大量的超時和鎖徵用的問題;實際應用中很少考慮這種隔離級別;