情景:最近公司有個業務,需要通過定時器通過時間判斷去對相關業務表的數據進行狀態進行變更。從功能實現的方式上,有兩種方式:【1】mysql設置定時器 【2】後臺代碼設置定時器(注:我這邊使用的是java實現的)。在此先記錄一下mysql的實現方式,下一篇再記錄java實現方式。
好了進入主題:mysql實現定時器任務,需要兩步:【1】創建一個存儲過程 【2】創建定時器
通過定時器去管理存儲過程,實現對應業務表數據狀態的改變。
下面記錄一下對timer_test表進行操作:
需求:當前時間與end_date時間進行比較,當前時間大於end_date時間,更新status爲0,每1分鐘執行一次。
【1】創建存儲過程
create procedure proc_test_timer()
begin
update timer_test set status='0' where timestampdiff( hour,end_date, sysdate()) >0;
end;
注意:上面SQL的結束的";"不要漏掉,不然創建會失敗。
【2】創建事件並啓動
create event proc_test_timer_event
on schedule every 1 minute starts timestamp '2020-01-01 00:00:00'
on completion PRESERVE
do call proc_test_timer();
【3】開啓和關閉定時器
– 啓動定時器
SET GLOBAL event_scheduler = 1;
– 停止定時器
SET GLOBAL event_scheduler = 0;
【4】開啓和關閉事件
– 開啓事件
ALTER EVENT proc_test_timer_event ON COMPLETION PRESERVE ENABLE;
– 關閉事件
ALTER EVENT proc_test_timer_event ON COMPLETION PRESERVE DISABLE;
注意:這裏的事件名稱要與上面創建的事件名稱保持一致。
【5】查看定時器和事件
--查看定時器狀態
SHOW VARIABLES LIKE '%sche%';
--查看事件
select * from mysql.event;
到這裏就完成,下面我們查看一下:
--查看
select * from timer_test
最後結果如下:
OK 這次就到這裏啦