什么是MDL
成都創(chuàng)新互聯(lián)是專業(yè)的巴青網(wǎng)站建設(shè)公司,巴青接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行巴青網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
MDL,Meta Data lock,元數(shù)據(jù)鎖,一般稱為字典鎖。字典鎖與數(shù)據(jù)鎖相對應(yīng)。字典鎖是為了保護(hù)數(shù)據(jù)對象被改變,一般是一些DDL會對字典對象改變,如兩個事物,事物1先查詢表,然后事物2試圖alter,其首先需要等待事物1結(jié)束(提交或回滾),此時的狀態(tài)便是Waiting for table metadata lock,然后才能獲得字典鎖。后續(xù)對TableA的任何操作(包括讀)都無法進(jìn)行,也會在Opening tables的階段進(jìn)入Waiting for table metadata lock的隊列。如果是線上業(yè)務(wù)的核心表出現(xiàn)了這樣的鎖等待隊列,就會造成災(zāi)難性的后果。數(shù)據(jù)鎖是保護(hù)表中的數(shù)據(jù),如兩個事物同時更新一行時,先得到row lock的事務(wù)會先執(zhí)行,后者只能等待。
出現(xiàn)的情況:
場景一:
通過show processlist可以看到TableA上有正在進(jìn)行的操作(包括讀),此時alter table語句無法獲取到metadata 獨(dú)占鎖,會進(jìn)行等待。出現(xiàn)Waiting for table metadata lock
場景二:
通過show processlist看不到TableA上有任何操作,但實(shí)際上存在有未提交的事務(wù),可以information_schema.innodb_trx中查看到。在事務(wù)沒有完成之前,TableA上的鎖不會釋放,alter table同樣獲取不到metadata的獨(dú)占鎖。
場景三:
通過show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也沒有任何進(jìn)行中的事務(wù)。這很可能是因?yàn)樵谝粋€顯式的事務(wù)中,對TableA進(jìn)行了一個失敗的操作(比如查詢了一個不存在的字段),這時事務(wù)沒有開始,但是失敗語句獲取到的鎖依然有效。從performance_schema.events_statements_current表中可以查到失敗的語句。