精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL 客戶端 Ctrl + C,服務端會發生什么?

數據庫 MySQL
Ctrl + C 之后,客戶端會干什么,服務端又會發生什么?我們一起來看看。

我們也許有過這樣的經歷:用 mysql? 客戶端連上數據庫,執行一條 SQL,結果遲遲執行不完,我們等得不耐煩了,順手就是一個 Ctrl + C。

Ctrl + C 之后,客戶端會干什么,服務端又會發生什么?我們一起來看看。

本文內容基于 MySQL 8.0.32 源碼,涉及存儲引擎為 InnoDB。

1、客戶端會干什么?

想要觀察 Ctrl + C 時,客戶端會干什么,用 mysql 連接數據庫時可以指定 -v 參數,如下:

mysql -h127.0.0.1 -uroot -v

連上數據庫之后,執行一條 SQL(以 UPDATE 為例?)。SQL 執行完成之前,在鍵盤上按下 Ctrl + C,如下:

注意:沒有使用 begin 顯式開啟事務,且系統變量 autocommit 的值為 ON。

mysql> UPDATE t1 SET blob1 = REPEAT("這是 blob2 字段", 10240);
--------------
UPDATE t1 SET blob1 = REPEAT("這是 blob2 字段", 10240)
--------------

-- 客戶端發送 KILL QUERY 給服務端之后
-- 輸出的提示信息
^C^C -- sending "KILL QUERY 11" to server ...

# 服務端執行 KILL QUERY 之后
# 客戶端自己的輸出信息
^C -- query aborted

-- 服務端返回給客戶端的信息
ERROR 1317 (70100): Query execution was interrupted

從以上輸出可以看到,客戶端 Ctrl + C,實際上是給服務端發出了一條 KILL QUERY 命令。

這和我們手動執行 KILL QUERY 命令是一樣的,接下來,我們就來看看服務端是怎么執行 KILL QUERY 命令的。

2、KILL QUERY

在 KILL QUERY 命令之前,客戶端已經發出了一條 Update SQL,服務端分配了一個線程,正在執行 Update SQL。

Update SQL 還沒執行完,客戶端 Ctrl + C 又發出了 KILL QUERY 命令,服務端收到命令之后,會調度另一個線程來執行 KILL QUERY 命令。

為了方便介紹,我們把執行 Update SQL 的線程稱為 Update 線程?,執行 KILL QUERY 命令的線程稱為 Kill 線程?。注意:MySQL 內部是不做這樣區分的。

KILL QUERY 命令的執行流程如下:

第 1 步,Kill 線程根據 query id? 查找 Update 線程。如果沒有找到?,KILL QUERY 命令執行結束;如果找到了,進入第 2 步。

query id? 是 show processlist 執行結果中的 id 字段。

第 2 步,Kill 線程判斷當前連接的 MySQL 用戶是否有權限干掉 Update 線程。如果沒有?權限,KILL QUERY 命令執行結束;如果有權限,進入第 3 步。

第 3 步,判斷 Update 線程是否正在讀寫數據字典表。

如果不是?,Kill 線程繼續執行第 4 ~ 6 步;如果是,Kill 線程的使命就到此結束了,接力棒交給 Update 線程。

Update 線程?讀寫數據字典表結束,就會馬上開始執行 KILL QUERY 命令的第 3 ~ 6 步。

這種情況下,第 3 步會被執行 2 次(Kill 線程和 Update 線程各執行一次)。

第 4 步,把 Update 線程的 killed? 屬性設置為 KILL_QUERY?,此時,Update 線程處于被標記為將要被干掉,但是還沒有被干掉的狀態。

這一步可以想象成城市建設過程中,在要拆遷的房子上寫了個大大的拆字,但是房子還立在那里。

第 5 步,如果 Update 線程正在等待獲取存儲引擎中的鎖,則放棄等待;如果 Update 線程已經持有存儲引擎中的鎖,則釋放鎖。

第 6 步,判斷 Update 線程是否持有某個條件變量?(保存在 current_cond)中。

如果持有,發送廣播通知正在等待這個條件變量的其它線程,告訴它們可以繼續執行了。

通過前面的介紹,我們可以看到:不管是 Kill 線程,還是 Update 線程自己執行?第 3 ~ 6 步?,都只是給 Update 線程打上了 KILL_QUERY 標記,而沒有直接把 Update 線程干掉。

Update 線程是怎么被干掉的呢?請繼續往下看。

3、自己把自己干掉

KILL QUERY 執行過程中,為什么不直接把 Update 線程干掉?

不是不想,而是不能。

因為線程不管執行什么操作,都需要進行收尾工作,做到有始有終。

如果 Update 線程直接被干掉,就來不及進行收尾工作,例如:已經申請的內存無法釋放,會導致內存泄漏。

所以,想要妥善干掉一個線程,需要即將被干掉的線程主動配合 Kill 線程才行。

妥善干掉一個 Update 線程的場景是這樣的:

Kill 線程對 Update 線程說:我要把你干掉。

Update 線程回答:不勞你動手,我自己來。

MySQL 讓這個場景變成現實的方式,是在代碼中的各個角落進行埋點,埋點邏輯:判斷當前線程是否被打上了 KILL_QUERY 標記,如果?是,則中斷正在執行的操作,進入收尾階段。

舉個例子:

// sql/sql_update.cc
// 以下代碼處理更新單表的 SQL,例如:
// update t1 set i1 = 100
bool Sql_cmd_update::update_single_table(THD *thd) {
...
while (true) {
// 從存儲引擎讀取一條記錄
error = iterator->Read();
// 如果讀取出錯(error)
// 或者 thd->killed 不等于 0(也就是 true)
// 對應本文的場景是:線程被打上了 KILL_QUERY 標記
// 直接結束循環
if (error || thd->killed) break;
...
}
...
}

從以上代碼可以看到,執行 Update 操作過程中,如果發現讀取出錯(對應本文場景是 Update 線程被打上了 KILL_QUERY 標記),直接 break 退出循環,中斷執行。

4、回滾

Update 線程執行過程中,事務有可能已經增、刪、改了一些數據,中斷正在執行的操作之后,事務是需要回滾的。

當 Update 線程的執行流程回到 mysql_execute_command():

int mysql_execute_command(THD *thd, bool first_level) {
...
if ((thd->is_error() && !early_error_on_rep_command) ||
(thd->variables.option_bits & OPTION_MASTER_SQL_ERROR))
trans_/opt/data/workspace_c/mysql8/sql/sql_class.ccrollback_stmt(thd);
else {
/* If commit fails, we should be able to reset the OK status. */
thd->get_stmt_da()->set_overwrite_status(true);
trans_commit_stmt(thd);
thd->get_stmt_da()->set_overwrite_status(false);
}
...
}

從代碼中可以看到,thd->is_error() 返回 true,說明事務執行過程中出現了錯誤,對應到本文的場景,就是事務被 KILL QUERY 中斷了,會執行 trans_rollback_stmt(thd),回滾事務。

只有在開啟組復制(GROUP REPLICATION)過程中出現錯誤時,early_error_on_rep_command 才有可能被設置為 true,這里我們先忽略。

到這里,KILL QUERY 就算是基本介紹完了。

之所以說基本介紹完了,是因為還留有一點點尾巴。

前面我們介紹過,Update 線程執行到埋點的時候,如果判斷自己已經被標記為即將被干掉,就會中斷執行。

但是,還有一種很小的可能性,就是 Update 線程執行過程中,已經經過了所有埋點之后,才被標記為即將被干掉,Update 線程也就沒有機會中斷執行了。

這種情況下,就會進入以上代碼中的 else 分支,執行 trans_commit_stmt(thd),提交事務。

鑒于進入 else 分支提交事務的可能性很小,我們可以認為只要客戶端 Ctrl + C,Update 線程就會中斷執行,并回滾事務。

5、總結

客戶端連接上 MySQL 之后,給服務端發送一條 SQL,SQL 執行完成之前,客戶端 Ctrl + C,實際上會給服務端發送一條 KILL QUERY 命令,和我們手動執行 kill query <query_id> 的效果是一樣的。

服務端會分配一個空閑線程(Kill 線程)執行 kill query 操作,給 Update 線程打上 KILL_QUERY 標記。

如果即將被干掉的線程(Update 線程)正在讀寫數據字典表,它會從 kill 線程手上接過接力棒,給自己打上 KILL_QUERY 標記。

Update 線程發現自己被打上了 KILL_QUERY 標記,就會中斷執行,在 mysql_execute_command() 方法中,會回滾事務。

有一點需要說明,前面只是以 Update SQL 為例來介紹 KILL QUERY,其它 SQL 的 KILL QUERY 流程也是一樣的。?

6、番外篇

前面 1 ~ 5 小節介紹的是沒有通過 begin 語句顯式開啟事務,并且系統變量 autocommit 的值是 ON 的場景。

如果通過 begin 顯式開啟了事務,或者把系統變量 autocommit 的值設置為 OFF,前面 1 ~ 5 小節介紹的內容也是適用的,但是會有一點區別:

4.回滾小節只能作用于事務中的一條 SQL,而不會影響整個事務。至于整個事務是提交還是回滾,取決于我們會給服務端發送 commit 還是 rollback 語句。

本文轉載自微信公眾號「一樹一溪」,可以通過以下二維碼關注。轉載本文請聯系一樹一溪公眾號。

責任編輯:姜華 來源: 一樹一溪
相關推薦

2009-08-21 16:14:52

服務端與客戶端通信

2009-08-21 15:59:22

服務端與客戶端通信

2009-08-21 15:36:41

服務端與客戶端

2009-08-21 15:54:40

服務端與客戶端

2023-04-03 08:13:05

MySQLCtrl + C

2011-09-09 09:44:23

WCF

2010-03-18 17:47:07

Java 多客戶端通信

2024-03-06 14:58:52

客戶端微服務架構

2010-11-19 14:22:04

oracle服務端

2015-01-13 10:32:23

RestfulWeb框架

2021-10-19 08:58:48

Java 語言 Java 基礎

2021-06-11 06:54:34

Dubbo客戶端服務端

2022-09-05 14:36:26

服務端TCP連接

2010-05-28 14:11:37

SVN1.6

2012-03-02 10:38:33

MySQL

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2011-08-17 10:10:59

2022-01-05 08:03:23

C#通信Rest

2009-08-06 17:12:13

C# WebServi

2022-05-19 09:02:45

開源zabbix監控
點贊
收藏

51CTO技術棧公眾號

日本熟女毛茸茸| 9.1成人看片| xxxx成人| 国产欧美精品区一区二区三区| 久久婷婷国产麻豆91天堂| 日本黄色三级大片| 久久久久久久久免费视频| 成人午夜精品在线| 国产91九色视频| 久久久久久国产精品视频| 九一亚洲精品| 日韩女同互慰一区二区| 欧美日韩在线免费播放| 超碰免费在线观看| 风流少妇一区二区| 国产精品亚洲自拍| 天天综合网久久综合网| 91精品观看| 亚洲一区二区久久久| 黄色av电影网站| 欧美视频精品| 亚洲成人av一区二区| 亚洲一区精品视频| 视频一区二区在线播放| 国产sm精品调教视频网站| 国产欧美日韩中文字幕在线| 精品少妇一区二区三区密爱| 91精品亚洲一区在线观看| 亚洲丝袜美腿综合| 日韩欧美亚洲日产国| 无码国产精品96久久久久| 国产精品一二三在| 成人免费观看网址| 中文字幕av第一页| 丝瓜av网站精品一区二区| 少妇高潮久久77777| 一本色道综合久久欧美日韩精品 | 国产精品15p| 91精品午夜视频| 亚洲黄色av网址| 欧美gay视频| 欧美性高潮床叫视频| 欧美大片在线播放| 6699嫩草久久久精品影院| 一区二区在线观看不卡| 久久国产精品久久精品国产| 亚洲成人中文字幕在线| 国产福利一区在线| 亚洲一区制服诱惑| 国产婷婷一区二区三区久久| 一区二区三区四区五区精品视频 | 99精品国产在热久久| 一区二区三区高清国产| 欧美人与性动交α欧美精品| 欧美xxxx性| 欧美日韩国产成人在线91| 香港日本韩国三级网站| 69堂免费精品视频在线播放| 亚洲色图制服诱惑| 日韩第一页在线观看| 国产原厂视频在线观看| 亚洲免费观看视频| 久久久7777| 日av在线播放| 欧美激情在线观看视频免费| 亚洲欧洲一二三| 精品国产99久久久久久| 亚洲精品精品亚洲| 国产主播自拍av| 中文字幕在线中文字幕在线中三区| 中文字幕在线免费不卡| 美女黄色片网站| 日本高清在线观看视频| 欧美日韩国产一中文字不卡| 亚洲欧洲日产国码无码久久99| 国产精品实拍| 国产视频一区在线观看| 亚洲美女搞黄| 日本高清成人vr专区| 午夜久久久久久| 欧美一二三不卡| 精品丝袜在线| 欧美少妇一区二区| 老女人性生活视频| 亚洲美女久久| 久久久成人精品视频| 日本三级网站在线观看| 日韩经典中文字幕一区| 亚洲综合精品伊人久久| 无码精品黑人一区二区三区| 国产精品色噜噜| 欧美国产综合在线| 成人免费网站www网站高清| 制服.丝袜.亚洲.中文.综合| 91av在线免费| 天天久久夜夜| 国产视频精品自拍| 久久久久久久麻豆| 亚洲专区一区| 91精品黄色| av在线免费播放网站| 亚洲愉拍自拍另类高清精品| 国产一级特黄a大片免费| 中文字幕一区日韩精品 | 久久久精品网站| 亚洲天堂日韩av| 黄一区二区三区| 久久精品第九区免费观看 | 九色综合国产一区二区三区| 国产精品免费一区二区三区在线观看| 午夜免费福利视频| 国产亚洲精品aa| 伊人av成人| 国产理论在线观看| 91久久奴性调教| 色悠悠在线视频| 亚洲成人99| 国产欧美日韩丝袜精品一区| 日本不卡免费播放| 欧美激情一区二区在线| 欧美大片在线播放| 91另类视频| 国产丝袜一区二区三区| 久久久久人妻一区精品色欧美| 在线亚洲自拍| 99视频在线播放| 免费观看久久久久| 亚洲午夜视频在线观看| 国产精品视频中文字幕| 精品九九在线| 国产精品aaaa| 日韩有码电影| 精品欧美一区二区三区| 涩视频在线观看| 午夜久久福利| 99九九电视剧免费观看| 男人资源在线播放| 欧美日韩精品三区| 美女扒开腿免费视频| 欧美激情第二页| 亚洲一区二区三| 超碰在线观看免费版| 欧美女孩性生活视频| 久久久久亚洲AV成人无码国产| 国产精品入口久久| 国产999精品久久久| 蜜芽tv福利在线视频| 日韩欧美中文字幕在线观看| av网站有哪些| 免费一区视频| 日本一区二区在线视频| 欧美123区| 亚洲精品一区二区三区四区高清| 在线观看国产精品一区| 视频在线观看91| 色大师av一区二区三区| 久久精品97| 久久综合久久八八| 99久久精品免费看国产交换| 亚洲综合免费观看高清完整版在线| 97在线免费公开视频| 性欧美lx╳lx╳| 日本欧美一级片| 不卡在线视频| 欧美精品xxxxbbbb| 国产精品成人免费观看| 日产欧产美韩系列久久99| 国产伦精品一区二区三区高清| 麻豆视频在线| 亚洲第一精品自拍| 青青草偷拍视频| 黑人巨大精品欧美一区| 日本精品福利视频| 豆花视频一区| 俺去啦;欧美日韩| 亚洲经典一区二区三区| 自拍视频在线观看一区二区| 波多野结衣天堂| 永久亚洲成a人片777777| 国产噜噜噜噜噜久久久久久久久| 男人av在线| 在线播放中文字幕一区| 久久精品视频免费在线观看| 97精品久久久久中文字幕| 中文字幕国产传媒| 黄色日韩精品| 亚洲国产精品www| 精品人人人人| 国产中文字幕91| 阿v视频在线观看| 色多多国产成人永久免费网站| 欧美一级做a爰片免费视频| 1024成人网| av鲁丝一区鲁丝二区鲁丝三区| 亚洲精品欧美| 一区二区三区四区视频在线观看| 777午夜精品电影免费看| 欧美日韩高清区| 福利视频在线导航| 欧美亚洲综合另类| 国产传媒在线看| 9久草视频在线视频精品| 亚洲免费看av| 午夜亚洲性色福利视频| 三级在线免费观看| 不卡视频在线| 国产91一区二区三区| 成人免费黄色| 国产成人精品久久| 1024免费在线视频| 日韩国产在线播放| 性生活视频软件| 欧美精品乱码久久久久久按摩| 日本午夜在线观看| 国产欧美日韩精品a在线观看| 日本不卡一区在线| 噜噜噜在线观看免费视频日韩| 欧美二区在线看| 第一区第二区在线| 91传媒在线免费观看| 青青草国产一区二区三区| 日韩av观看网址| 亚洲妇女成熟| 97人人做人人爱| 国产福利小视频在线观看| 亚洲精品videossex少妇| 成 人 免费 黄 色| 日韩欧美在线中文字幕| 久久久久久久久久久久久久av| 国产欧美一区二区精品久导航 | 久草在线中文最新视频| 欧美xxxx做受欧美.88| 免费观看在线午夜影视| 中文字幕一精品亚洲无线一区| 国产99999| 欧美丰满美乳xxx高潮www| 怡春院在线视频| 欧美视频三区在线播放| 久久久综合久久| 一区二区三区在线观看动漫| 黄色a级片在线观看| 1区2区3区精品视频| 国产黄色网址在线观看| 91丨porny丨最新| 亚洲专区区免费| 国产精品18久久久久| 自拍一级黄色片| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 亚洲色图一区二区三区| 久久久久久久久久97| 亚洲免费色视频| av女人的天堂| 欧美激情中文字幕一区二区| 少妇一级黄色片| 国产精品久久久久久亚洲伦 | 国产 日韩 亚洲 欧美| 亚洲网站视频| 国产一区二区在线视频播放| 亚洲综合国产激情另类一区| av免费在线播放网站| 七七婷婷婷婷精品国产| 激情在线观看视频| 国产福利91精品一区| 国产chinese中国hdxxxx| 狠狠色狠狠色综合日日91app| 亚洲美免无码中文字幕在线| 一区二区三区四区在线观看国产日韩 | 久久成人在线视频| 国产一级网站视频在线| 中文字幕亚洲综合| 欧美黄色视屏| 青青久久av北条麻妃海外网| 国产精品久久乐| 99久热re在线精品996热视频| 国产精品亲子伦av一区二区三区| 欧美一级成年大片在线观看| 丝袜美腿av在线| 久久资源免费视频| 手机av在线| 国产日本欧美在线观看| 视频一区中文字幕精品| 免费日韩电影在线观看| 亚欧美无遮挡hd高清在线视频| 亚洲人成网站在线播放2019| 国内精品久久久久久久影视简单 | 日产精品99久久久久久| 日日夜夜亚洲精品| 国内精品视频在线播放| 六月丁香久久丫| 午夜视频久久久| 日本欧美肥老太交大片| 久草视频国产在线| 奇米影视一区二区三区| 无码人妻丰满熟妇啪啪网站| 国产欧美一区二区精品性色 | 国产一区二区女内射| 亚洲成色777777在线观看影院| 狠狠躁日日躁夜夜躁av| 欧美刺激脚交jootjob| 国产永久免费高清在线观看| 久久91亚洲人成电影网站| 激情在线视频播放| 国产精品成人va在线观看| aaa国产精品| 亚洲AV无码成人精品一区| 香蕉久久夜色精品| 免费男同深夜夜行网站| 国产成人免费视| 欧美三级黄色大片| 在线一区二区三区| 亚洲系列在线观看| 日韩一区二区麻豆国产| jizzjizz在线观看| 欧美在线性爱视频| 卡通动漫精品一区二区三区| 91制片厂免费观看| 日韩精品1区2区3区| 无码人妻精品一区二区三应用大全 | av小次郎在线| 国产精品网站大全| 国产亚洲一区二区三区不卡| 综合操久久久| 日韩av不卡一区二区| 蜜桃av免费看| 欧美日韩国产区| 亚洲日本国产精品| 午夜精品久久久久久久99热浪潮| 一区二区三区电影大全| 国产精品免费观看高清| 欧美色图首页| 免费黄色av网址| 亚洲免费视频成人| www精品国产| 色综合五月天导航| 中文字幕日韩在线| 免费的一级黄色片| 国产91精品免费| 久久久精品视频在线| 精品三级在线观看| 毛片大全在线观看| 国产精品美女诱惑| 亚洲精品三级| 99re久久精品国产| 狠狠色狠色综合曰曰| 欧美日韩免费做爰大片| 日本高清不卡在线| 国产一区不卡| 欧美 日韩 亚洲 一区| 成人午夜免费视频| 免费观看一区二区三区毛片| 日韩电影在线观看中文字幕| 午夜影视一区二区三区| 欧美日韩视频在线一区二区观看视频| 欧美久久成人| 精人妻一区二区三区| 日韩毛片视频在线看| 欧美精品韩国精品| 国产亚洲福利一区| 日本一区二区三区中文字幕| 性做爰过程免费播放| 日韩1区2区3区| 一区二区三区影视| 日韩一区二区视频在线观看| 日本成人在线播放| 亚洲一区二区久久久久久久| 国产综合婷婷| 中文字幕av网址| 欧美三级电影精品| 污污在线观看| 91亚洲精品一区| 亚洲国产免费看| 亚洲精品乱码久久久久久9色| 国产精品蜜臀在线观看| 国产福利免费视频| 欧美一级高清免费| 国产精品99在线观看| 天天色综合天天色| 欧美国产日产图区| 99久久婷婷国产一区二区三区| 中文字幕国产亚洲2019| 国产亚洲高清一区| av观看免费在线| 亚洲日本va在线观看| 你懂的在线视频| 亚洲中国色老太| 久久综合狠狠| www.av视频| 日韩精品一区二区三区四区| 久久电影tv| 成人国产一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 无码人妻丰满熟妇奶水区码| 久久久av亚洲男天堂| 最新亚洲精品| 在线中文字日产幕| 精品日本高清在线播放| 视频在线不卡| 国产精品999999| 在线播放不卡| 神马午夜精品91|