情景:最近公司有个业务,需要通过定时器通过时间判断去对相关业务表的数据进行状态进行变更。从功能实现的方式上,有两种方式:【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 这次就到这里啦