我最近做项目遇到一个问题就是数据库的的订单需要定时检查自己的订单状态, 如果到了 endtime 字段的时间订单状态还是 2, 就将订单状态修改为 4
在网上找到类似的解决方法.
定时的关键是要结合 mysql 的某些时间函数.
如下文:
mysql 可以实现定时触发功能, 比如说定于某某时间 mysql 数据库做什么工作, 或每隔多长时间做什么工作.
第二种情况应用还是比较广的, 比如说我希望每天检查一下我的数据信息, 超过一个月的无用信息清除以腾出空间供其他存储数据使用; 或者相隔一段时间更新一下数据等等.
下面讨论下这种情况, 给出一个例子供大家参考:
1. 首先定义一个存储过程取名为 e_test, 注意竖线 ("|") 一定不能丢
- DELIMITER |
- DROP PROCEDURE IF EXISTS e_test |
- CREATE PROCEDURE e_test()
- BEGIN
- update order set status=1 where to_days(now())-TO_DAYS(date)>=1and status=0;
- END
- |
假设有一个 order 表, 并且表里有一个 status 字段和一个 date 字段, 现在将 date 中的时间距现在时间超过 1 天的并且状态 status=0 的这条数据的状态 status 改成 1.
2. 创建定时器取名为 event_test
- SET GLOBAL event_scheduler = 1;
- CREATE EVENT IF NOT EXISTS event_test
- ON SCHEDULE EVERY 1 SECOND
- ON COMPLETION PRESERVE
- DO CALL e_test();
创建一个定时器, 每间隔 1 秒触发一次事件, 即每个一秒执行一次上面定义的 e_test 这个存储过程.
3. 这个是最简单但是也是最重要的, 我们要手动的启动这个定时器, 要不然是没法工作的.
- ALTER EVENT event_test ON
- COMPLETION PRESERVE ENABLE;
最后提醒一点, 创建存储过程与创建定时器代码要分开执行, 否则会报错, 暂时还不知道为什么, 个人以为这个可能是数据库创建好存储过程需要一定的缓冲时间来做好准备, 我们要认为的给他留出这个时间. 当然这个时间对数据库来说是一定的时间, 但是对于我们来说仅仅是眨眼之间的功夫, 只要分开两次执行时间就足够了.
个人的一点体会, 希望对大家有帮助.
个别环境哟经常检查 show variables like '%event_scheduler%';, 确保此数据库权限已开就 ok 了
开启 event_scheduler sql 指令:
- SET GLOBAL event_scheduler = ON;
- SET @@global.event_scheduler = ON;
- SET GLOBAL event_scheduler = 1;
- SET @@global.event_scheduler = 1;
相反, 关闭 event_scheduler 指令:
- SET GLOBAL event_scheduler = OFF;
- SET @@global.event_scheduler = OFF;
- SET GLOBAL event_scheduler = 0;
- SET @@global.event_scheduler = 0;
来源: http://www.bubuko.com/infodetail-2659385.html