mysql innodb下的鎖及隔離級別


innodb引擎支持行級鎖。

鎖實現了事務之間的隔離功能。

悲觀鎖,排他鎖種類:

  1. row-level lock 或record lock    都是指的行級鎖

  2. gap                 間隙鎖

  3. next-lock              下鍵鎖

 

 

 

隔離級別(隔離的是數據的讀,默認的級別是RR模式):也稱讀的隔離性級別

查看數據庫當前隔離級別:select @@tx_isolation;

  1. RU  讀未遞交,出現臟讀.  即讀取到了內存臟頁中的數據

  2. RC  讀已遞交,出現不可重復讀,也出現了幻讀,隔離了臟讀

  3. RR  可重復讀,解決了不可重復讀,利用undo的快照技術;

      也會有幻讀,但是利用GAP間隙鎖+nextlock下鍵鎖可以解決幻讀現象,

      該種級別下(利用的MVCC機制),每開啟一窗口都會有一undo快照,不論其它窗口中如何修改數據,

      在當前窗口中查到的數據都不會有任何變化,除非重新登陸。

      MVCC多版本控制機制,就是利用undo快照來實現的。

  4. SE  串行化,可以防止死鎖,但並發事務性能差

 

配置文件中設置隔離級別:vim /xx/my.cnf中添加

  1. transaction_isolation=read-uncommitted

  2. transaction_isolation=read-committed

  3. transaction_isolation=repeatable-read

 

臟讀講解:

  發生於RU模式下,即讀取到了內存臟頁中的數據,叫臟讀;

不可重復讀講解:

  發生於RC模式下,在一個窗口中不斷的修改數據並遞交,在另一個窗口中每次查詢都能查到最新的數據值

  這種現象叫做不可重復讀。

可重復讀講解:

  發生於RR模式下,在一個窗口中不斷的修改數據並遞交,在另一個窗口中每次查詢的結果都是最原始的數據

  除非另一個窗口斷開重連(或手動commit下),才能看到修改值。注意前提:登陸好兩個窗口后不要斷開重連。

幻讀講解:

  發生於RC和RR模式中,在窗口1中使用范圍修改A列的值,窗口2中又插入了此范圍的數據,且窗口2先於

  窗口1遞交事務,當窗口1中的范圍修改執行完成並遞交后,查詢此范圍數據時,會看到A列值不全為修改值,

  即看到了窗口2中新插入的數據A列值未被修改。

  不可重復讀和幻讀的區別:

    不可重復讀表現為某行數據一直在發生變化

    幻讀表現為統一修改范圍內列值后對修改期間插入的數據不受影響。

 

  解決幻讀的必備條件(范圍條件比如為id>5的數據):

    1. 處於RR模式;

    2. GAP間隙鎖和nextlock下鍵鎖不是真正的記錄鎖,不會鎖定數據行,只鎖定索引列。所以必須為索引列

     利用GAP鎖鎖定現有id>5范圍內一些不連續的間隔,不允許對間隔數據寫入

     利用nextlock鎖定大於5范圍內最大值后的數據,不允許寫入大於當前最大id值的數據。

     GAP和nextlock鎖是在滿足以上2個條件時自動上鎖的,之前在RC模式中窗口2中可毫無阻擋的插入范圍內數據,

      現在滿足以上2條件,再插入時會阻塞在原地。

  

 


免責聲明!

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



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