http://www.cnblogs.com/chenqionghe/p/4845693.html
https://tech.meituan.com/innodb-lock.html
按類型分:
共享鎖(IS):允許一個(gè)事務(wù)去讀一行载弄,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖护糖。
排他鎖(IX):允許獲取排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同的數(shù)據(jù)集共享讀鎖和排他寫鎖绎速。
按粒度分:
表級(jí)鎖
行級(jí)鎖
MyISAM 不支持事務(wù)八毯,表級(jí)鎖搓侄;InnoDB 支持事務(wù),行級(jí)鎖
InnoDB行鎖實(shí)現(xiàn)方式
InnoDB行鎖是通過(guò)索引上的索引項(xiàng)來(lái)實(shí)現(xiàn)的话速,這一點(diǎn)MySQL與Oracle不同讶踪,后者是通過(guò)在數(shù)據(jù)中對(duì)相應(yīng)數(shù)據(jù)行加鎖來(lái)實(shí)現(xiàn)的。
InnoDB這種行鎖實(shí)現(xiàn)特點(diǎn)意味者:只有通過(guò)索引條件檢索數(shù)據(jù)泊交,InnoDB才會(huì)使用行級(jí)鎖乳讥,否則柱查,InnoDB將使用表鎖!
MVCC 多版本并發(fā)控制
Innodb的默認(rèn)隔離級(jí)別是:RR 可重復(fù)讀云石,就是通過(guò)MVCC來(lái)實(shí)現(xiàn)的唉工。通過(guò)MVCC實(shí)現(xiàn)了可重復(fù)讀,并且不需要加鎖汹忠。
在InnoDB中淋硝,會(huì)在每行數(shù)據(jù)后添加兩個(gè)額外的隱藏的值來(lái)實(shí)現(xiàn)MVCC,這兩個(gè)值一個(gè)記錄這行數(shù)據(jù)何時(shí)被創(chuàng)建宽菜,另外一個(gè)記錄這行數(shù)據(jù)何時(shí)過(guò)期(或者被刪除)谣膳。
在實(shí)際操作中,存儲(chǔ)的并不是時(shí)間赋焕,而是事務(wù)的版本號(hào)参歹,每開啟一個(gè)新事務(wù),事務(wù)的版本號(hào)就會(huì)遞增隆判。
Innodb的幻讀解決
Innodb的默認(rèn)隔離級(jí)別是:RR 可重復(fù)讀犬庇,但其實(shí)是已經(jīng)解決了RR級(jí)別的幻讀問(wèn)題。
行鎖防止別的事務(wù)修改或刪除侨嘀,
GAP鎖防止別的事務(wù)新增臭挽,
行鎖和GAP鎖結(jié)合形成的的Next-Key鎖共同解決了RR級(jí)別在寫數(shù)據(jù)時(shí)的幻讀問(wèn)題。
InnoDB有三種行鎖的算法:
1咬腕,Record Lock:?jiǎn)蝹€(gè)行記錄上的鎖欢峰。
2,Gap Lock:間隙鎖涨共,鎖定一個(gè)范圍纽帖,但不包括記錄本身。GAP鎖的目的举反,是為了防止同一事務(wù)的兩次當(dāng)前讀懊直,出現(xiàn)幻讀的情況。
3火鼻,Next-Key Lock:1+2室囊,鎖定一個(gè)范圍,并且鎖定記錄本身魁索。對(duì)于行的查詢融撞,都是采用該方法,主要目的是解決幻讀的問(wèn)題粗蔚。
Gap 鎖(間隙鎖):
http://blog.chinaunix.net/uid-20726500-id-5749804.html
假如user表中只有101條記錄尝偎,其userid 的值分別是1,2,…,100,101,下面的SQL:
SELECT * FROM user WHERE userid > 100 FOR UPDATE
上面是一個(gè)范圍條件的檢索鹏控,InnoDB不僅會(huì)對(duì)符合條件的userid 值為101的記錄加鎖冬念,也會(huì)對(duì)userid 大于101(這些記錄并不存在)的“間隙”加鎖