根據(jù)加鎖的范圍,MYSQL里面的鎖大致分為全局鎖、表級(jí)鎖、行鎖。
全局鎖:對(duì)整個(gè)數(shù)據(jù)庫(kù)實(shí)例加鎖。命令:Flush tables with read lock (FTWRL)
表級(jí)鎖:一種是表鎖,一種是元數(shù)據(jù)鎖(meta data lock,MDL)。
行鎖:
1、全局鎖
全局鎖命令:Flush tables with read lock (FTWRL)
應(yīng)用場(chǎng)景: 做全庫(kù)邏輯備份。
single-transaction 方法只適用于所有的表使用事務(wù)引擎的庫(kù)。
2、表級(jí)鎖
表鎖語(yǔ)法:lock tables … read/write,比如lock tables t1 read, t2 write;
釋放鎖:unlock tables
應(yīng)用場(chǎng)景:一般在數(shù)據(jù)庫(kù)引擎不支持行鎖的時(shí)候會(huì)被用到。
在 alter table 語(yǔ)句里面設(shè)定等待時(shí)間,如果在這個(gè)指定的等待時(shí)間里面能夠拿到 MDL 寫鎖最好,拿不到也不要阻塞后面的業(yè)務(wù)語(yǔ)句,先放棄:
ALTER TABLE tbl_name NOWAIT add column ...
ALTER TABLE tbl_name WAIT N add column ...
3、行鎖
行鎖:在引擎層由各個(gè)引擎自己實(shí)現(xiàn)的。行鎖針對(duì)數(shù)據(jù)表中行記錄的鎖。
兩階段鎖協(xié)議:在 InnoDB 事務(wù)中,行鎖是在需要的時(shí)候才加上的,但并不是不需要了就立刻釋放,而是要等到事務(wù)結(jié)束時(shí)才釋放。
死鎖:在并發(fā)系統(tǒng)中不同線程出現(xiàn)循環(huán)資源依賴,涉及的線程都在等待別的線程釋放資源時(shí),就會(huì)導(dǎo)致這幾個(gè)線程都進(jìn)入無(wú)限等待的狀態(tài)。
死鎖檢測(cè):發(fā)現(xiàn)死鎖后,主動(dòng)回滾死鎖鏈條中的某一個(gè)事務(wù),讓其他事務(wù)得以繼續(xù)執(zhí)行。將參數(shù) innodb_deadlock_detect = on,表示開啟這個(gè)邏輯。