【61期】MySQL行鎖和表鎖的含義及區(qū)別(MySQL面試第四彈)
閱讀本文大概需要 4?分鐘。
來(lái)自:網(wǎng)絡(luò)
一、前言
lock in share mode,例如:select??math?from?zje?where?math>60?lock?in?share?mode;
for update,例如:select?math?from?zje?where?math?>60?for?update;
二、表鎖
MyISAM引擎
表共享讀鎖
表獨(dú)占寫鎖
對(duì)MyISAM表的讀操作,不會(huì)阻塞其它進(jìn)程對(duì)同一表的讀請(qǐng)求,但會(huì)阻塞對(duì)同一表的寫請(qǐng)求。只有當(dāng)讀鎖釋放后,才會(huì)執(zhí)行其它進(jìn)程的寫操作。
對(duì)MyISAM表的寫操作,會(huì)阻塞其它進(jìn)程對(duì)同一表的讀和寫操作,只有當(dāng)寫鎖釋放后,才會(huì)執(zhí)行其它進(jìn)程的讀寫操作。
三、行鎖
CREATE?TABLE?`user`?(
??`name`?VARCHAR(32)?DEFAULT?NULL,
??`count`?INT(11)?DEFAULT?NULL,
??`id`?INT(11)?NOT?NULL?AUTO_INCREMENT,
??PRIMARY?KEY?(`id`)
)?ENGINE=INNODB?AUTO_INCREMENT=7?DEFAULT?CHARSET=utf8
--?這里,我們建一個(gè)user表,主鍵為id
--?A通過(guò)主鍵執(zhí)行插入操作,但事務(wù)未提交
update?user?set?count=10?where?id=1;
--?B在此時(shí)也執(zhí)行更新操作
update?user?set?count=10?where?id=2;
--?由于是通過(guò)主鍵選中的,為行級(jí)鎖,A和B操作的不是同一行,B執(zhí)行的操作是可以執(zhí)行的
--?A通過(guò)name執(zhí)行插入操作,但事務(wù)未提交
update?user?set?count=10?where?name='xxx';
--?B在此時(shí)也執(zhí)行更新操作
update?user?set?count=10?where?id=2;
--?由于是通過(guò)非主鍵或索引選中的,升級(jí)為為表級(jí)鎖, -- B則無(wú)法對(duì)該表進(jìn)行更新或插入操作,只有當(dāng)A提交事務(wù)后,B才會(huì)成功執(zhí)行
for update
--?A用戶對(duì)id=1的記錄進(jìn)行加鎖
select?*?from?user?where?id=1?for?update;
--?B用戶無(wú)法對(duì)該記錄進(jìn)行操作
update?user?set?count=10?where?id=1;
--?A用戶commit以后則B用戶可以對(duì)該記錄進(jìn)行操作
行鎖必須有索引才能實(shí)現(xiàn),否則會(huì)自動(dòng)鎖全表,那么就不是行鎖了。
兩個(gè)事務(wù)不能鎖同一個(gè)索引。
insert,delete,update在事務(wù)中都會(huì)自動(dòng)默認(rèn)加上排它鎖。
擴(kuò)展:間隙鎖
--?用戶A
update?user?set?count=8?where?id>2?and?id<6
--?用戶B
update?user?set?count=10?where?id=5;
建議:
盡可能讓所有數(shù)據(jù)檢索都通過(guò)索引來(lái)完成,避免無(wú)索引行鎖升級(jí)為表鎖
合理設(shè)計(jì)索引,盡量縮小鎖的范圍
盡可能減少索引條件,避免間隙鎖
盡量控制事務(wù)大小,減少鎖定資源量和時(shí)間長(zhǎng)度
【60期】事務(wù)隔離級(jí)別中的可重復(fù)讀能防幻讀嗎?(MySQL面試第三彈)
【59期】MySQL索引是如何提高查詢效率的呢?(MySQL面試第二彈)
【58期】盤點(diǎn)那些面試中最常問(wèn)的MySQL問(wèn)題,第一彈!
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?
評(píng)論
圖片
表情

