基本上鎖是根據(jù)不同的存儲引擎
表鎖:開銷小,加鎖快,鎖力度大,鎖沖突高,并發(fā)能力低
行鎖:開銷大,加鎖慢(需要通過索引查詢,然后加鎖),鎖沖突低,并發(fā)能力高
頁鎖:介于兩者之間(PS:由于BDB已經(jīng)被InnoDB所取代镊逝,我們只討論MyISAM表鎖和InnoDB行鎖的問題)
表鎖:
共享讀鎖,獨占寫鎖
行鎖:
共享鎖(S):允許一個事務(wù)去讀一行壮啊,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖。
排他鎖(X):允許獲得排他鎖的事務(wù)更新數(shù)據(jù)撑蒜,阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和排他寫鎖歹啼。另外,為了允許行鎖和表鎖共存座菠,實現(xiàn)多粒度鎖機(jī)制狸眼,InnoDB還有兩種內(nèi)部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖浴滴。
意向共享鎖(IS):事務(wù)打算給數(shù)據(jù)行加行共享鎖拓萌,事務(wù)在給一個數(shù)據(jù)行加共享鎖前必須先取得該表的IS鎖。
意向排他鎖(IX):事務(wù)打算給數(shù)據(jù)行加行排他鎖升略,事務(wù)在給一個數(shù)據(jù)行加排他鎖前必須先取得該表的IX鎖微王。
理解:
就是在加行鎖的時候需要獲取對應(yīng)的意向鎖,其他行鎖進(jìn)來操作不同的行是互不影響的,但是對那些沒有利用索引檢索加鎖的語句就會進(jìn)行表意向鎖校驗,簡單一點就是,大家都用索引修改,修改不同的行互不影響,但是沒用索引,并不知道修改的是哪一行數(shù)據(jù),默認(rèn)加表鎖都不讓修改
重點,重點重點:要使用行鎖必須必須用索引.不然默認(rèn)是表鎖,
即便在條件中使用了索引字段,但是否使用索引來檢索數(shù)據(jù)是由MySQL通過判斷不同執(zhí)行計劃的代價來決定的品嚣,如果MySQL認(rèn)為全表掃描效率更高骂远,比如對一些很小的表,它就不會使用索引腰根,這種情況下InnoDB將使用表鎖激才,而不是行鎖。因此额嘿,在分析鎖沖突時瘸恼,別忘了檢查SQL的執(zhí)行計劃,以確認(rèn)是否真正使用了索引
詳細(xì):https://blog.csdn.net/zxh2075/article/details/83503012