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條件,再插入時會阻塞在原地。