91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL 由于MDL讀鎖select被阻塞

發布時間:2020-08-08 23:29:33 來源:ITPUB博客 閱讀:441 作者:哎呀我的天吶 欄目:MySQL數據庫

thread 1、begin;

更新表;沒有提交,也沒有回滾操作

thread2、create index 在這個表上

這時候客戶端超時中斷

再次連接會話查詢此表被阻塞,無法查詢

thread3、查詢 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的讀寫鎖互斥

MySQL 由于MDL讀鎖select被阻塞

為什么C等待拿鎖之后,D也會阻塞?其實這里并沒有解釋清楚。因為如果按并發理解的話,

C,D應當是同等級,都有可能拿到鎖的。但C讀寫鎖互斥,D讀讀不互斥,這樣的話就跟上圖所述相悖了。

就,查了一下。

(鳴謝 一夢如是YFL提供的文章)

首先是MDL(metaData Lock)的概念。元數據鎖是server層的鎖,表級鎖,主要用于隔離DML(Data Manipulation Language,數據操縱語言,如select)和DDL(Data Definition Language,數據定義語言,如改表頭新增一列)操作之間的干擾。 每執行一條DML、DDL語句時都會申請MDL鎖, DML操作需要MDL讀鎖,DDL操作需要MDL寫鎖(MDL加鎖過程是系統自動控制,無法直接干預,讀讀共享,讀寫互斥,寫寫互斥)

MySQL 由于MDL讀鎖select被阻塞

申請MDL鎖的操作會形成一個隊列, 隊列中寫鎖獲取優先級高于讀鎖 。一旦出現寫鎖等待,不但當前操作會被阻塞,同時還會阻塞后續該表的所有操作。事務一旦申請到MDL鎖后,直到事務執行完才會將鎖釋放。(這里有種特殊情況如果事務中包含DDL操作,mysql會在DDL操作語句執行前,隱式提交commit,以保證該DDL語句操作作為一個單獨的事務存在,同時也保證元數據排他鎖的釋放,例如id 44的語句改為<begin;alter table testok add z varchar(10) not Null;select * from testok;>,此時一旦alter語句執行完成會馬上提交事務(autocommit=1),后面的select就在本次事務之外,其執行完成后不會持有讀鎖)

這樣就能解釋通為什么session C被阻塞后,session D也運行不了的原因了。

簡而言之MDL鎖互斥,select也要申請MDL的讀鎖,這一點真是有點惡心。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

雅江县| 亳州市| 新昌县| 湘潭县| 仁怀市| 元阳县| 思南县| 柳河县| 拉萨市| 桂林市| 阿坝| 广昌县| 沙河市| 石棉县| 突泉县| 郓城县| 台北县| 福鼎市| 广州市| 鲁甸县| 文化| 文成县| 青浦区| 福州市| 望江县| 驻马店市| 桐柏县| 抚州市| 时尚| 灵山县| 汝城县| 长兴县| 屯留县| 洱源县| 青田县| 四子王旗| 大姚县| 绩溪县| 塔城市| 郯城县| 琼结县|