MySQL的鎖分類以及使用場景

myisam存儲(chǔ)引擎默認(rèn)是表級鎖

innodb存儲(chǔ)引擎默認(rèn)是行級鎖

DBD存儲(chǔ)引擎默認(rèn)是頁面鎖

表級鎖:開銷小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)出鎖沖突的概率最高,并發(fā)度最低。

行級鎖:開鎖大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。

頁面鎖:開銷和加鎖時(shí)間界于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。

從上述特點(diǎn)可見,很難籠統(tǒng)的說哪種鎖更好,只能就具體應(yīng)用的特點(diǎn)來說哪種鎖更合適!僅從鎖的角度來說:表級鎖

更于以查詢?yōu)橹鳎挥猩倭堪此饕龡l件更新數(shù)據(jù)的應(yīng)用,如WEB應(yīng)用;而行級鎖則更適合于有大理按索引發(fā)更新少量

不同數(shù)據(jù),同時(shí)又有并發(fā)查詢的應(yīng)用,如一些在線事務(wù)處理系統(tǒng)。


for update的鎖表

InnoDB默認(rèn)是行級別的鎖,當(dāng)有明確指定的主鍵時(shí)候,是行級鎖。否則是表級別。

例子: 假設(shè)表foods ,存在有id跟name、status三個(gè)字段,id是主鍵,status有索引。

例1: (明確指定主鍵,并且有此記錄,行級鎖)

SELECT * FROM foods WHERE id=1 FOR UPDATE;

SELECT * FROM foods WHERE id=1 and name=’咖啡色的羊駝’ FOR UPDATE;

例2: (明確指定主鍵/索引,若查無此記錄,無鎖)

SELECT * FROM foods WHERE id=-1 FOR UPDATE;

例3: (無主鍵/索引,表級鎖)

SELECT * FROM foods WHERE name=’咖啡色的羊駝’ FOR UPDATE;

例4: (主鍵/索引不明確,表級鎖)

SELECT * FROM foods WHERE id<>’3’ FOR UPDATE;

SELECT * FROM foods WHERE id LIKE ‘3’ FOR UPDATE;

for update的注意點(diǎn)

1.for update 僅適用于InnoDB,并且必須開啟事務(wù),在begin與commit之間才生效。

2.要測試for update的鎖表情況,可以利用MySQL的Command Mode,開啟二個(gè)視窗來做測試。

for update的疑問點(diǎn)

當(dāng)開啟一個(gè)事務(wù)進(jìn)行for update的時(shí)候,另一個(gè)事務(wù)也有for update的時(shí)候會(huì)一直等著,直到第一個(gè)事務(wù)結(jié)束嗎?

答:會(huì)的。除非第一個(gè)事務(wù)commit或者rollback或者斷開連接,第二個(gè)事務(wù)會(huì)立馬拿到鎖進(jìn)行后面操作。

如果沒查到記錄會(huì)鎖表嗎?

答:會(huì)的。表級鎖時(shí),不管是否查詢到記錄,都會(huì)鎖定表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容