myisam存儲引擎默認(rèn)是表級鎖
innodb存儲引擎默認(rèn)是行級鎖
DBD存儲引擎默認(rèn)是頁面鎖
表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)出鎖沖突的概率最高,并發(fā)度最低。
行級鎖:開鎖大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。
從上述特點(diǎn)可見,很難籠統(tǒng)的說哪種鎖更好,只能就具體應(yīng)用的特點(diǎn)來說哪種鎖更合適!僅從鎖的角度來說:表級鎖
更于以查詢?yōu)橹鳎挥猩倭堪此饕龡l件更新數(shù)據(jù)的應(yīng)用,如WEB應(yīng)用;而行級鎖則更適合于有大理按索引發(fā)更新少量
不同數(shù)據(jù),同時又有并發(fā)查詢的應(yīng)用,如一些在線事務(wù)處理系統(tǒng)。
for update的鎖表
InnoDB默認(rèn)是行級別的鎖,當(dāng)有明確指定的主鍵時候,是行級鎖。否則是表級別。
例子: 假設(shè)表foods ,存在有id跟name、status三個字段,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,開啟二個視窗來做測試。
for update的疑問點(diǎn)
當(dāng)開啟一個事務(wù)進(jìn)行for update的時候,另一個事務(wù)也有for update的時候會一直等著,直到第一個事務(wù)結(jié)束嗎?
答:會的。除非第一個事務(wù)commit或者rollback或者斷開連接,第二個事務(wù)會立馬拿到鎖進(jìn)行后面操作。
如果沒查到記錄會鎖表嗎?
答:會的。表級鎖時,不管是否查詢到記錄,都會鎖定表