理解MySQL——鎖,事務,隔離級別,併發控制(未完待續)

1.MySQL服務器邏輯架構

      圖片來源:MySQL官網
      理解MySQL——鎖,事務,隔離級別,併發控制(未完待續)
      每個連接都會在MySQL服務端產生一個線程(內部通過線程池管理線程)。比如:一個select語句進入,MySQL首先會在查詢緩存中查找是否緩存了這個select結果集,如果沒有則繼續執行解析→優化→執行得過程;否則直接從緩存中獲取結果集。

2.MySQL鎖

2.1共享鎖與排他鎖(Shared and Exclusive Locks)

      共享鎖和排他鎖都是標準的行級鎖
      1)共享鎖S:標準的讀鎖,讀鎖允許多個連接可以同一時刻併發讀取同一資源,互不干擾。
      2)排他鎖X:又稱寫鎖,一個寫鎖會阻塞其他的寫鎖或讀鎖,保證同一個時刻只有一個連接可以寫入數據,同時防止其他用戶對這個數據的讀寫

鎖類型 英文名 又稱 同一時刻 共同點
共享鎖S Shared Locks 讀鎖 同一時刻,允許多個連接併發的讀取同一資源,互不干擾。 兩者都是鎖機制本身的策略,通過這兩種策略對鎖進行了區分
排他鎖X Exclusive Locks  寫鎖 同一時刻只有一個連接可以寫入數據,同時防止其他用戶對這個數據的讀寫。 同上

2.2意向鎖(Intention Locks)

      背景:多粒度鎖的並存場景。
      InnoDB支持多粒度鎖(鎖粒度:可分爲行鎖表鎖),允許行鎖和表鎖共存。爲了實現多粒度級別的鎖定,InnoDB使用了意圖鎖。
      意向鎖表級別的鎖。先提前聲明的一個意向,並獲取表級別的意向鎖(共享意向鎖IS或排他意向鎖IX),如果獲取成功,則稍後將要或正在(才被允許),對該表的某些行加鎖(S或X)了。
      注意:除了LOCK TABLES...WRITE,會鎖住表中的所有行,其他場景意向鎖實際鎖不住任何行。
      意向協議鎖:在事務能夠獲取表中的行上的共享鎖之前,他必須首先獲取表上的IS鎖或更強的鎖。在事務能夠獲取表中的行上的獨佔鎖之前,它必須首先獲取表上的IX鎖
      意向鎖實現的背景是多粒度鎖的並存場景,兼容性如下:

X IX S IS
X Conflict Conflict Conflict Conflict
IX Conflict Compatible Conflict Compatible
S Conflict Conflict Compatible Compatible
IS Conflict Compatible Compatible Compatible

      Conflict:互斥
      Compatible:兼容
      意向鎖僅表示意向,是一種較弱的鎖,意向鎖之間兼容並行(IS,IX之間兼容並行)。X與IS,IX互斥,S與IX互斥。意向鎖是比X/S更弱的鎖,存在一種預判的意義。先獲取更弱的IS,IX鎖,如果獲取失敗就不必再獲取更強S,X鎖。

2.3索引行鎖(Record Locks)

        eg:SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE,如果c1上的索引被使用到。防止其他事務變動c1=10的行。
        record lock總會在索引行上加鎖。即使一個表並沒有設置任何索引,這時候innoDB也會創建一個隱式的聚集索引(primary Key),然後在這個聚集索引上加鎖。
        當查詢字段沒有索引時,eg:update t setcolumn=“A” where column B=“B”,如果columnB字段不存在索引(或者不是組合索引前綴),這條語句會鎖住所有記錄也就是鎖表。如果語句的執行能夠執行一個columnB字段的索引,那麼僅會鎖住滿足where的行。

2.4間隙鎖(Gap locks)

        間隙鎖:鎖定索引記錄之間的間隙,或者鎖定一個索引記錄之前的間隙,或者鎖定一個索引記錄之後的間隙。
        例如:SELECT uid FROM t1 WHERE uid BETWEEN 1and 4 FOR UPDATE,阻止其他事務將值插入到列uid中,因爲該範圍內所有現有值之間的間隙都是鎖定的。
        對於使用唯一索引來搜索唯一行的語句select a from,不產生間隙鎖定。(不包含組合唯一索引,即:gapLock不作用於單列唯一索引
        例如:SELECT *FROM t WHERE id=100,如果id沒有索引或者具有非唯一索引,則語句將鎖定前面的間隙。如果id列有位移的索引,上面的語句只對id值爲100的行使用索引記錄鎖,其他會話是否在前一個間隙中插入行並不重要。
        間隙可以跨越單個索引值和多個索引值,甚至空的。
        間隙鎖是性能和併發鎖之間權衡的以重摺衷,用於某些特定的事務隔離級別,如RC級別。
        在重疊的間隙中(或者重疊的行記錄)允許gap共存。
        同一個gap中,允許一個事務持有gap X-Lock(gap寫鎖/排他鎖),同時另一個事務在這個gap中持有(gap寫鎖/排他鎖)

2.5next-key lock

        next-key lock是record lock與gap lock的組合。
        例如:存在一個查詢匹配b=6的行(b上有一個非唯一索引),NextLock就是:在b=6的行加上了RecordLock鎖,並且使用了GapLock鎖定了b=6之前(“之前”:索引排序)的所有行記錄。
        MySQL查詢時執行行級鎖策略,會對掃描過程中的行進行加鎖(X或S),也就是加上Record Lock,同時會對這個記錄之前的所有行加上Gap Lock。
        假設一個索引包含值10,11,13和20.該索引肯恩的Next Key Lock鎖定以下區間:
        理解MySQL——鎖,事務,隔離級別,併發控制(未完待續)
        注意:innoDB默認隔離級別(RR)下,next key lock自動開啓。(原因:gap作用於RR,如果是RC,gap Lock不會生效,那麼next key lock自然也不會生效)。

2.6插入意向鎖(Insert Intention Locks)

        insert intention lock是一種發生在insert插入語句時的gap lock間隙鎖鎖定插入行之前的所有行
        插入意向鎖以這樣一種方式表明插入的意圖,如果插入到同一索引間隙中的多個事務沒有插入到該間隙中的相同位置,則他們不需要等待對方。
        例如:存在值爲5和8的索引記錄,嘗試分別插入6和7的獨立事務,在獲得所插入行上的獨佔鎖之前,每個事務使用insert intention lock鎖定4和7之間的間隙,但不會阻塞彼此,因爲這些行爲不衝突。

理解MySQL——鎖,事務,隔離級別,併發控制(未完待續)
理解MySQL——鎖,事務,隔離級別,併發控制(未完待續)

2.7AUTO-INC Locks

        AUTO-INC 鎖是一種特殊的表級鎖,產生於這樣的場景:事務插入(inserting into )到具有 AUTO_INCREMENT 列的表中。
        在最簡單的情況下,如果一個事務正在向表中插入值,那麼其他任何事務必須等待向該表中插入它們自己的值,以便由第一個事務插入的行接收連續的主鍵值。
 

3.事務

        事務就是一組原子性的 sql,或者說一個獨立的工作單元。 事務就是說,要麼 MySQL 引擎會全部執行這一組sql語句,要麼全部都不執行(比如其中一條語句失敗的話)。

3.1自動提交(AutoCommit,MySQL 默認)

   理解MySQL——鎖,事務,隔離級別,併發控制(未完待續)
        MySQL 默認採用 AutoCommit 模式,也就是每個 sql 都是一個事務,並不需要顯式的執行事務。如果 autoCommit 關閉,那麼每個 sql 都默認開啓一個事務,只有顯式的執行“commit”後這個事務纔會被提交。

3.2顯示事務 (START TRANSACTION...COMMIT)

        示例:小Y 要給 大L 轉賬100塊錢,需要執行一下三個操作:
        1)檢查 小Y 的賬戶餘額是否大於100塊;
        2)小Y 的賬戶減少100塊;
        3)大L 的賬戶增加100塊。
        這三個操作就是一個事務,必須打包執行,要麼全部成功, 要麼全部不執行,其中任何一個操作的失敗都會導致所有三個操作“不執行”——回滾。

3.3事務的ACID

        A(atomiciy) 原子性:一個事務必須保證其中的操作要麼全部執行,要麼全部回滾,不可能存在只執行了一部分這種情況出現。
        C(consistency) 一致性:數據必須保證從一種一致性的狀態轉換爲另一種一致性狀態。 比如上一個事務中執行了第二步時系統崩潰了,數據也不會出現 小Y 的賬戶少了100塊,但是 大L 的賬戶沒變的情況。要麼維持原裝(全部回滾),要麼小Y少了100塊同時 大L 多了100塊,只有這兩種一致性狀態的。
        I(isolation)隔離性:在一個事務未完成執行時,通常會保證其他Session無法看到這個事務的執行結果。
        D(durability)持久性:數據一旦commit,就會保存下來。及時數據提交完以後系統崩潰,數據也不會丟失。
 

4.隔離級別

        

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