国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

MySQL 由于MDL讀鎖select被阻攔

2024-07-24 12:32:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

        thread 1、begin;
 
       更新表;沒(méi)有提交,也沒(méi)有回滾操作
 
       thread2、create index 在這個(gè)表上
 
       這時(shí)候客戶(hù)端超時(shí)中斷
 
再次連接會(huì)話(huà)查詢(xún)此表被阻塞,無(wú)法查詢(xún)
 
thread3、查詢(xún) select * from test;
 
root@localhost : yaochong 17:08:27> select id,user,host,db,command,time,state,info from information_schema.processlist where user <>'system user' and info not like '%system user%';
+-------+------+-----------+----------+---------+------+---------------------------------+---------------------------------------------------------------+
| id    | user | host      | db       | command | time | state                           | info                                                          |
+-------+------+-----------+----------+---------+------+---------------------------------+---------------------------------------------------------------+
| 10161 | root | localhost | yaochong | Query   | 3386 | Waiting for table metadata lock | select * from test                                            |
| 10092 | root | localhost | yaochong | Query   | 6375 | Waiting for table metadata lock | alter table test add key(name) , ALGORITHM=INPLACE, LOCK=NONE |
+-------+------+-----------+----------+---------+------+---------------------------------+---------------------------------------------------------------+
2 rows in set (0.00 sec)
MySQL 由于MDL讀鎖select被阻塞
 
原因參考如下MDL的讀寫(xiě)鎖互斥
 
MySQL 由于MDL讀鎖select被阻塞
 
為什么C等待拿鎖之后,D也會(huì)阻塞?其實(shí)這里并沒(méi)有解釋清楚。因?yàn)槿绻床l(fā)理解的話(huà),
 
C,D應(yīng)當(dāng)是同等級(jí),都有可能拿到鎖的。但C讀寫(xiě)鎖互斥,D讀讀不互斥,這樣的話(huà)就跟上圖所述相悖了。
 
就,查了一下。
 
(鳴謝 一夢(mèng)如是YFL提供的文章)
 
首先是MDL(metaData Lock)的概念。元數(shù)據(jù)鎖是server層的鎖,表級(jí)鎖,主要用于隔離DML(Data Manipulation Language,數(shù)據(jù)操縱語(yǔ)言,如select)和DDL(Data Definition Language,數(shù)據(jù)定義語(yǔ)言,如改表頭新增一列)操作之間的干擾。 每執(zhí)行一條DML、DDL語(yǔ)句時(shí)都會(huì)申請(qǐng)MDL鎖, DML操作需要MDL讀鎖,DDL操作需要MDL寫(xiě)鎖(MDL加鎖過(guò)程是系統(tǒng)自動(dòng)控制,無(wú)法直接干預(yù),讀讀共享,讀寫(xiě)互斥,寫(xiě)寫(xiě)互斥)
 
MySQL 由于MDL讀鎖select被阻塞
 
申請(qǐng)MDL鎖的操作會(huì)形成一個(gè)隊(duì)列, 隊(duì)列中寫(xiě)鎖獲取優(yōu)先級(jí)高于讀鎖 。一旦出現(xiàn)寫(xiě)鎖等待,不但當(dāng)前操作會(huì)被阻塞,同時(shí)還會(huì)阻塞后續(xù)該表的所有操作。事務(wù)一旦申請(qǐng)到MDL鎖后,直到事務(wù)執(zhí)行完才會(huì)將鎖釋放。(這里有種特殊情況如果事務(wù)中包含DDL操作,mysql會(huì)在DDL操作語(yǔ)句執(zhí)行前,隱式提交commit,以保證該DDL語(yǔ)句操作作為一個(gè)單獨(dú)的事務(wù)存在,同時(shí)也保證元數(shù)據(jù)排他鎖的釋放,例如id 44的語(yǔ)句改為<begin;alter table testok add z varchar(10) not Null;select * from testok;>,此時(shí)一旦alter語(yǔ)句執(zhí)行完成會(huì)馬上提交事務(wù)(autocommit=1),后面的select就在本次事務(wù)之外,其執(zhí)行完成后不會(huì)持有讀鎖)
 
這樣就能解釋通為什么session C被阻塞后,session D也運(yùn)行不了的原因了。
 
簡(jiǎn)而言之MDL鎖互斥,select也要申請(qǐng)MDL的讀鎖,這一點(diǎn)真是有點(diǎn)惡心。

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠州市| 汾西县| 远安县| 沛县| 肇庆市| 安吉县| 彝良县| 丹棱县| 都匀市| 宿迁市| 二手房| 康平县| 区。| 华蓥市| 牡丹江市| 扶余县| 都兰县| 怀来县| 介休市| 卢龙县| 年辖:市辖区| 额济纳旗| 台安县| 巴塘县| 枣阳市| 天全县| 图们市| 清远市| 察隅县| 马边| 通山县| 广东省| 天等县| 土默特左旗| 醴陵市| 邯郸市| 文水县| 赣榆县| 罗田县| 汉沽区| 宽甸|