MySQL數據庫中沒有SQLServer數據庫中那種傳統的定時作業的概念。但是提供了一種【事件】的東西,基本和定時作業貌離神合。
下面我們在MySQL中創建一個事件,它的作用是去監測時間很長的異常查詢,并且去主動殺掉該線程以防止數據庫發生死鎖的風險。
-- 開啟事件調度器,以便能夠運行周期性的事件
SET GLOBAL event_scheduler = ON;CREATE EVENT IF NOT EXISTS kill_long_running_queries
-- 設置事件調度,這里設置為每10秒執行一次
ON SCHEDULE EVERY 10 SECOND
-- 定義事件要執行的SQL代碼塊
DOBEGIN-- 聲明一個變量`done`用于控制循環的結束,默認為FALSEDECLARE done INT DEFAULT FALSE;-- 聲明一個變量`course_id`用于存儲查詢的進程IDDECLARE course_id INT;-- 創建一個游標`cur1`,用于遍歷查詢超過10分鐘的查詢進程DECLARE cur1 CURSOR FOR SELECT id FROM information_schema.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 300;-- 當游標遍歷完成后,設置`done`為TRUE以退出循環DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;-- 打開游標OPEN cur1;-- 開始循環遍歷游標中的結果read_loop: LOOP-- 從游標中獲取下一行數據到變量`course_id`FETCH cur1 INTO course_id;-- 如果游標遍歷完成,則退出循環IF done THENLEAVE read_loop;END IF;-- 殺掉進程ID為`course_id`的查詢KILL course_id;END LOOP;-- 關閉游標CLOSE cur1;END;
以上僅是查詢了當前數據庫中的所有異常進程(或線程),要做完善的話還可以查詢異常的事務并且殺掉。即SELECT * FROM information_schema.INNODB_TRX。等日后有空閑時間我會去完善。
下面是查詢當前數據庫中有哪些【事件】
SHOW EVENTS;
以上就是我為解決MySQL數據庫死鎖而出的解決方案以及方案的落地。大家有什么好的方案可以提出來在評論區交流。可以是從數據庫為出發點的方案,也可以是以代碼請求為出發點的方案。