精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品美女久久久久| 17c丨国产丨精品视频| 在线观看日本网站| 亚洲人成网77777色在线播放| 亚洲成人一区在线| 久久综合狠狠综合久久综青草| 国产成人在线免费观看视频| 亚洲春色h网| 午夜国产精品影院在线观看| 精品在线不卡| 成人毛片在线播放| 日产精品一区二区| 欧美一级理论片| 激情伊人五月天| 少妇人妻偷人精品一区二区| 噜噜爱69成人精品| 日韩中文在线视频| 手机在线免费毛片| 黄色的网站在线观看| 国产美女娇喘av呻吟久久| 欧美精品18videosex性欧美| 国产精品无码久久久久久| 成人亚洲免费| 亚洲午夜精品在线| 视频一区二区在线观看| 亚洲视频一区在线播放| 欧美午夜一区| 一区二区在线免费视频| 日本人dh亚洲人ⅹxx| 综合日韩av| 亚洲欧洲三级电影| 久久精品99久久| 中文在线观看免费高清| 激情久久久久久| 中文欧美在线视频| 亚洲の无码国产の无码步美| 欧美jizz18| 欧美性黄网官网| 国产一二三四五| а天堂8中文最新版在线官网| 国产成人精品免费| 国产精品久久久久福利| 中文字幕在线字幕中文| 91精品国产乱码久久久久久| 亚洲欧美国内爽妇网| 日本一二三四区视频| 日韩中文视频| 亚洲在线视频一区| 异国色恋浪漫潭| 国产色a在线| 97久久久精品综合88久久| 91视频九色网站| 中文字幕精品一区二| 一本色道久久精品| 欧美激情手机在线视频 | 日本欧美日韩| 性久久久久久久久久久久| 国产精品av免费| 懂色av中文在线| 91蝌蚪porny九色| 黄色91av| 六月婷婷中文字幕| 国产成人鲁色资源国产91色综| 国产精品视频999| 一区二区三区在线观看av| 亚洲精选91| 97在线视频观看| 国产无码精品一区二区| 亚洲一级网站| 国内精品久久久久影院 日本资源| 男的操女的网站| 欧美艳星介绍134位艳星| 亚洲男人天堂视频| 精品成人无码一区二区三区| 自拍偷拍欧美一区| 亚洲日韩中文字幕| 91在线无精精品白丝| 神马电影久久| 亚洲午夜激情免费视频| 午夜影院黄色片| 欧美高清在线| 久久视频国产精品免费视频在线| 九九这里只有精品视频| 在线精品小视频| 欧美激情在线一区| 欧美日韩精品区| 免费视频一区二区三区在线观看| 日产日韩在线亚洲欧美| 中文字幕一区2区3区| 久久国产人妖系列| 91热精品视频| 色一情一乱一区二区三区| aaa欧美色吧激情视频| 免费看污久久久| 国产青青草在线| 国产精品狼人久久影院观看方式| 欧美h视频在线观看| 欧美黑人猛交的在线视频| 红桃av永久久久| 欧美两根一起进3p做受视频| 激情亚洲小说| 欧美成人vps| 亚洲午夜久久久久久久久红桃| 欧美日韩国产免费观看视频| 久久天堂电影网| 国产一区二区视频在线观看免费| 在线观看视频免费一区二区三区| 国产不卡精品视男人的天堂 | 一区二区三区在线视频免费观看| 免费一级特黄特色毛片久久看| sis001欧美| 在线电影院国产精品| 少妇一级淫片免费放播放| 精品国产精品| 欧美片一区二区三区| 中文字幕超碰在线| 久久91精品国产91久久小草| 精品国产一区二区三区麻豆小说| 1769视频在线播放免费观看| 亚洲免费av高清| 欧美a v在线播放| 亚洲综合视频| 亚洲免费一在线| 成人在线观看小视频| 黄色日韩在线| 国产精品一区二区久久| 欧美视频一二区| 国产精品久久久久一区二区三区共 | 激情久久av| av在线日韩国产精品| 亚洲最新视频在线观看| 无码少妇一区二区三区芒果| 97成人在线| 日韩亚洲欧美中文在线| 国产精品视频免费播放| 国产一区二区精品久久99| 欧美日本韩国一区二区三区| 欧美极品少妇videossex| 精品视频123区在线观看| 国产精品无码电影| 欧美在线不卡| 国产三级精品网站| 日韩大片b站免费观看直播| 亚洲免费毛片网站| wwww.国产| 欧美男男gaytwinkfreevideos| 色综合视频网站| 97视频免费在线| 国产日韩欧美综合一区| 青青草原成人网| 福利片在线一区二区| 久久国产天堂福利天堂| 中文字幕av无码一区二区三区| 2020国产精品久久精品美国| 福利视频一区二区三区四区| 未满十八勿进黄网站一区不卡| 国产一区二区免费| 黄色av网站免费观看| 91丨九色丨国产丨porny| av网站手机在线观看| 天堂av一区| 欧美精品一区二区三区国产精品| 国产99久久久久久免费看| 久久先锋资源网| 黄色av网址在线播放| 国产精品欧美大片| 久久久久中文字幕2018| 亚洲av无码国产综合专区| 亚洲欧美日韩一区| 午夜视频在线观| 午夜精品毛片| 亚洲aa在线观看| av理论在线观看| 777a∨成人精品桃花网| 一本色道久久88| 久久福利精品| 日韩和欧美的一区二区| 97久久网站| 日韩最新免费不卡| 国产麻豆一精品一男同| 亚洲免费观看高清| 性活交片大全免费看| 韩国在线一区| 久久久久综合一区二区三区| xxxxxx欧美| 中文字幕精品久久久久| 亚洲综合免费视频| 亚洲欧洲制服丝袜| 国产大学生av| 亚洲欧美日本视频在线观看| 日韩av高清| 精品女同一区二区三区在线观看| 日韩中文字幕视频| h狠狠躁死你h高h| 亚洲成人资源在线| 亚洲女优在线观看| 精品一二三四区| 男人天堂a在线| 校花撩起jk露出白色内裤国产精品| 国产精品第一区| 蜜桃传媒在线观看免费进入 | 国产在线观看免费网站| 91麻豆精品国产91久久久久久| 日本少妇久久久| 中文字幕一区日韩精品欧美| 中文字幕 日本| 国产一区三区三区| 青青青国产在线视频| 韩国欧美一区| 手机福利在线视频| 怕怕欧美视频免费大全| yy111111少妇影院日韩夜片| 成人在线视频免费| 国产69久久精品成人看| 国产在线观看a视频| 亚洲欧美中文日韩在线| 精品国产av一区二区三区| 在线免费不卡视频| 久草视频在线观| 亚洲最新视频在线播放| 久久成人小视频| 亚洲国产精华液网站w | 国产在线播放精品| 91九色单男在线观看| 日本精品在线一区| 欧美一级片在线播放| 欧美韩日亚洲| 九九热这里只有精品免费看| 免费黄色在线网站| 国产亚洲欧美aaaa| 日本天堂影院在线视频| 亚洲国产日韩欧美在线99| 精品国产av一区二区三区| 欧美日韩国产高清一区二区三区| 四虎影院在线免费播放| 婷婷综合另类小说色区| 中文字幕一区二区三区手机版| 一区二区三区欧美在线观看| 男女性高潮免费网站| 亚洲欧洲三级电影| 亚洲女人毛茸茸高潮| 中文字幕免费不卡| 精品人妻中文无码av在线| 久久久久9999亚洲精品| 中文字幕丰满乱子伦无码专区| 不卡的av在线| 怡红院一区二区| 成人午夜碰碰视频| 中文字幕人妻一区二区三区| 国产成人免费视频一区| 亚洲欧洲国产视频| 懂色av一区二区在线播放| 日韩女优在线视频| 成人激情av网| av鲁丝一区鲁丝二区鲁丝三区| av成人免费在线| 男人操女人动态图| 国产欧美日本一区二区三区| 成人在线观看免费高清| 中文字幕亚洲电影| 麻豆成人在线视频| 午夜视频在线观看一区二区三区 | 日本综合在线| 久青草国产97香蕉在线视频| a视频在线免费看| 欧美激情伊人电影| 天堂中文在线播放| 国产精品久久久久久网站 | 91免费高清视频| 亚洲国产精品免费视频| 不卡一区二区三区视频| 欧美freesex8一10精品| 欧美婷婷久久| 欧美高清在线| 日韩中字在线观看| 久久婷婷影院| aaa一级黄色片| 成人午夜av在线| 日本二区在线观看| 亚洲丝袜精品丝袜在线| 久久久久久久9999| 日韩欧美精品网址| 国产又粗又长又大视频| 精品国产1区2区3区| 毛片免费在线观看| 久热精品视频在线| 天天综合av| 91视频国产高清| 日韩高清三区| 一区二区三区视频在线播放| 韩国自拍一区| 噼里啪啦国语在线观看免费版高清版| 老汉av免费一区二区三区| 中文字幕久久久久久久| 久久婷婷国产综合国色天香| 欧美手机在线观看| 欧美午夜无遮挡| 国产精品一区二区av白丝下载| 日韩成人中文字幕| 成人av黄色| 国产999精品| 一区二区三区四区精品视频 | 户外极限露出调教在线视频| 欧美裸体男粗大视频在线观看| 竹内纱里奈兽皇系列在线观看| 91手机视频在线观看| 久久最新网址| 无码人妻精品一区二区蜜桃网站| 三级在线观看一区二区| 任你躁av一区二区三区| 国产精品福利影院| 青青青国产在线| 日韩免费一区二区三区在线播放| 国产视频二区在线观看| 性欧美长视频免费观看不卡| 国产精品亚洲综合在线观看| 色女孩综合网| 一本久道久久久| av在线天堂网| 一区在线中文字幕| 国产男人搡女人免费视频| 亚洲第一福利视频| wwwav在线| 国产免费成人av| 精品日本12videosex| 成 年 人 黄 色 大 片大 全| 国产精品性做久久久久久| 国产探花视频在线播放| 色综合天天狠狠| 无码精品一区二区三区在线| 欧美另类极品videosbestfree| 国产原创一区| 日韩欧美亚洲区| 久久久精品日韩| 美女100%无挡| 欧美性xxxx| 同心难改在线观看| 97在线视频免费| 开心激情综合| 欧美在线一区视频| 成人av片在线观看| 久久久久99精品| 日韩欧美的一区| 午夜伦理大片视频在线观看| 亚洲一区二区在线播放| 国产精品麻豆久久| 亚洲欧美日韩精品一区| 中文字幕精品综合| 中文字幕久久久久| 中文字幕一区二区三区电影| 51一区二区三区| 日韩免费电影一区二区| 日韩精彩视频在线观看| 久久亚洲无码视频| 欧美在线观看视频在线| 成人在线免费公开观看视频| 日韩av123| 久久人人88| 亚洲一区二区三区三州| 亚洲精品五月天| 亚洲精品国产片| 97精品久久久中文字幕免费| 精品视频在线你懂得| 777久久久精品一区二区三区| 久久亚洲综合色| 中文字幕人妻一区二区三区视频 | 特级西西人体wwwww| 一本色道亚洲精品aⅴ| 成人av电影观看| 成人做爽爽免费视频| 黄色欧美日韩| 中文字幕av网址| 欧美精品日日鲁夜夜添| 欧美人与禽性xxxxx杂性| 狠狠久久综合婷婷不卡| 久久精品卡一| a一级免费视频| 欧美va亚洲va香蕉在线| 操人在线观看| 日韩欧美视频一区二区三区四区| 狠狠色丁香久久婷婷综合_中| 麻豆影视在线播放| 日韩精品极品在线观看| 国产精品伊人| 免费特级黄色片| 国产欧美一区二区精品性| 国产美女三级无套内谢| 97超级碰在线看视频免费在线看| 国产一区二区精品久| 亚洲制服在线观看| 狠狠操狠狠色综合网| 精品孕妇一区二区三区| 好吊色欧美一区二区三区| 美女网站色91| 国产无码精品视频| 综合欧美国产视频二区| 综合久久成人| 天天干天天操天天玩| 亚洲a一区二区| 永久免费在线观看视频|