Mysql事務以及加鎖機制事務的特徵ACID

Mysql事務以及加鎖機制

  事務的特徵ACID,即原子性、一致性、隔離性、持久性。

  原子性保證一個事務爲一個最小的單元,內部不可分割;

  一致性保證事務中的每個操作線程不可單獨提交,成功則一起提交,不成功則事務回滾;

  隔離性保證不同事務間看到的數據視圖相互獨立,相互隔離(隔離級別可設置);

  持久性保證事務提交後數據會持久的保存下來;

  sql規範定義的事務的隔離級別:

  1.READ UNCOMMITTED(讀取未提交內容)

  所有事務可以看到未提交事務的執行結果,本隔離級別很少用到實際應用中,讀取未提交的數據,又稱爲“髒讀”。

  2.READ COMMITTED(讀取提交內容)

  大多數數據庫的默認隔離級別是此級別,但不是mysql默認的。一個事務在開始的時候只能看見已提交事務所做的改變。一個事務從開始到提交前所做的任何改變都是不可見的,除非提交。這種隔離級別也稱爲不可重複讀。

  3.REPEATABLE READ(可重複讀)

  此隔離級別是爲了解決可重複讀隔離級別導致的問題即一個事務多個實例併發讀取數據時會看到不同的結果。此隔離級別不會看到其他事務提交後的結果,即事務即使提交了我也看不到。此級別也稱爲“幻讀”。

  4.SERIALIZABLE(可串行化)

  可串行化是最高的隔離級別,它通過強制事務排序,使之不可重讀,解決了幻讀的問題。此隔離級別會在每個讀的數據行上加共享鎖,使用這種隔離級別會產生大量的超時現象,一般實際開發中不會用到。

  mysql加鎖機制:

  根據類型可分爲共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。

  根據粒度劃分又分表鎖和行鎖。表鎖由數據庫服務器實現,行鎖由存儲引擎實現。

  mysql提供了3種事務型存儲引擎,InnDB、NDB Cluster和Falcon。

  一個事務執行的任何過程中都可以獲得鎖,但是隻有事務提交或回滾的時候才釋放這些鎖。這些都是隱式鎖定,也可以顯式鎖定,InnoDB支持顯式鎖定,例如:

  SELECT .... LOCK IN SHARE MODE (加共享鎖)

  SELECT .....FOR UPDATE(加排他鎖)

  多版本併發控制(重要):

  Mysql的事務存儲引擎不是簡單實用行加鎖機制,而是叫多版本併發控制(MVCC)技術,和行加鎖機制關聯實用。以便應對更高的併發,當然是以消耗性能作爲代價。

  每種存儲引擎對MVCC的實現方式不同,InnoDB引擎的簡單實現方式如下:

  InnoDB通過爲每個數據航增加兩個隱含值的方式來實現。這兩個隱含值記錄了行的創建時間,以及過期時間。每一行存儲事件發生時的系統版本號。每一次開始一個新事務時版本號會自動加1,每個事務都會保存開始時的版本號,每個查詢根據事務的版本號來查詢結果。




個人理解 :


    MySQL使用以下幾種機制進行隔離性的實現:
        a.鎖機制
            通過使用加鎖機制,使用其它事務無法到讀某事務末提交前的數據更新,解決髒讀問題;
            mySQL 有:共享鎖,排他鎖,根據粒度,有行鎖,表鎖。
        b.MVCC機制:
        事務存儲引擎使用多版本併發控制(MVCC)技術,和行加鎖機制關聯使用
        MySQL 的InnoDB,XtraDB 引擎通過 使用MVCC 來解決幻讀問題。



發佈了221 篇原創文章 · 獲贊 53 · 訪問量 121萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章