鎖
一. 鎖概述
InnoDB默認(rèn)支持行級鎖匀钧,但也支持表級鎖
MyISAM,Memory支持表級鎖
三種鎖特性
1. 表級鎖
用于查詢?yōu)橹髅担倭堪此饕龡l件更新
開銷小之斯,加鎖快
不會出現(xiàn)死鎖
鎖粒度大,鎖沖突概率高朱浴,并發(fā)度低
2. 行級鎖
適用于大量按索引條件更新數(shù)據(jù)吊圾,如OLTP
開銷大,加鎖慢
會出現(xiàn)死鎖
鎖粒度小翰蠢,鎖沖突概率低,并發(fā)度高
3. 頁面鎖
加鎖時間介于前二者之間
會出現(xiàn)死鎖
并發(fā)度一般
二. MyISAM表鎖
1. 表鎖兼容性
讀寫互斥
2. 如何加表鎖
MyISAM在select前自動加讀鎖啰劲,更新前自動加寫鎖
MyISAM總是一次性獲得SQL語句的所有鎖---故無死鎖
3. MyISAM鎖調(diào)度
讀寫互斥梁沧,且寫請求比讀請求重要
故不適用大量更新和查詢應(yīng)用(查詢操作被永遠(yuǎn)阻塞)
避免長時間查詢操作,導(dǎo)致餓死寫請求--不要想一條SELECT搞定所有
三. 事務(wù)論
支持事務(wù)蝇裤;采用行級鎖
1. 事務(wù)的ACID特性
Atomicity 原子性
數(shù)據(jù)修改廷支,要么全執(zhí)行,要么全不執(zhí)行
Consistent 一致性
事務(wù)開始和完成時栓辜,數(shù)據(jù)一致
Isolation 隔離性
事務(wù)不受外部并發(fā)操作影響恋拍,獨(dú)立執(zhí)行
Durable 持久性
事務(wù)完成后,數(shù)據(jù)修改是永久性的藕甩,系統(tǒng)故障也能保持
2. 并發(fā)事務(wù)問題(鎖問題)
1) 更新丟失
最后的更新覆蓋了其他事務(wù)所做的更新
必須完全避免
2)臟讀
一個事務(wù)修改了記錄施敢,但未提交,同時另一個事務(wù)對該記錄進(jìn)行讀取
3)不可重復(fù)讀
事務(wù)再次讀取之前讀過的數(shù)據(jù)狭莱,該數(shù)據(jù)已改變或該記錄已被刪除
4)幻讀
一個事務(wù)相同條件查詢僵娃,發(fā)現(xiàn)其他事務(wù)插入了滿足條件的新數(shù)據(jù)
3. 事務(wù)隔離級別
臟讀、不可重復(fù)讀腋妙、幻讀----數(shù)據(jù)庫讀一致性問題默怨,事務(wù)隔離機(jī)制來解決
1) 事務(wù)隔離方式
- 讀取數(shù)據(jù)前加鎖
- MVCC(multiversion concurrency control ) --多版本并發(fā)控制(或多版本數(shù)據(jù)庫)
生成數(shù)據(jù)請求時間點(diǎn) 一致性數(shù)據(jù)快照(同一數(shù)據(jù),多個版本)
MVCC實(shí)現(xiàn)InnoDB一致性非鎖定讀:
若讀取的行正在delete,update操作骤素,不等待行上鎖釋放匙睹,轉(zhuǎn)去讀取行的一個數(shù)據(jù)快照愚屁。如下圖
2) 事務(wù)隔離級別
用以解決隔離與并發(fā)的矛盾,分為四種:
未提交讀(導(dǎo)致臟讀痕檬,很少用)
已提交讀(大多數(shù)數(shù)據(jù)庫默認(rèn)級別
可重復(fù)讀(mysql默認(rèn)霎槐,無法解決幻讀)
可序列化(每行加鎖,導(dǎo)致大量超時和鎖爭用谆棺,很少使用)
四. InnoDB鎖
1. InnoDB行鎖模式及加鎖方法
兩種行鎖:
1) 共享鎖(S)
- 允許一個事務(wù)讀一行栽燕,阻止其他事務(wù)獲得相同數(shù)據(jù)的 排他鎖
- 加鎖語句:
select * from table where... LOCK IN SHARE MODE
2) 排他鎖(X)
- 持X的事務(wù)可更新數(shù)據(jù),阻止其他事務(wù)(取得相同數(shù)據(jù)集)的 共享讀鎖 和 排他寫鎖
- 加鎖語句:
select * from table where...FOR UPDATE
兩種意向鎖(表鎖):
InnoDB自動加
對更新語句改淑,自動加X鎖
普通SELECT語句碍岔,不加鎖
1) 意向共享鎖(IS)
事務(wù)想獲得表中某幾行的共享鎖
事務(wù)在對數(shù)據(jù)行加S鎖前,必須先取得表IS鎖
2)意向排他鎖(IX)
事務(wù)想獲得表中某幾行的排他鎖
2. InnoDB行鎖實(shí)現(xiàn)方式
- InnoDB行鎖通過對索引項(xiàng)加鎖實(shí)現(xiàn)
- 無索引朵夏,則通過聚簇索引加鎖
- 不通過索引條件檢索蔼啦,InnoDB會鎖定所有記錄,導(dǎo)致大量鎖沖突仰猖,效果等同于表鎖
三種InnoDB鎖算法
1) record lock
索引項(xiàng)加鎖
2) gap lock
對第一條記錄前捏肢,索引項(xiàng)之間,最后一條記錄之后 的 間隙 加鎖
3) next-key lock
前二者組合饥侵,對記錄和前面的間隙加鎖
用于范圍條件查詢
3. Next-Key鎖
Gap
鍵值在條件范圍內(nèi)鸵赫,但不存在的記錄
目的
防止幻讀
恢復(fù)和復(fù)制機(jī)制需要
會阻塞條件范圍內(nèi)鍵值插入,導(dǎo)致嚴(yán)重鎖等待躏升,故盡量用相等條件
例:
id={1,2,3....101}
select * from table where id>100 for update
對101辩棒,>101(間隙)加鎖