MySQL定时器

 

公司最近在做的一个项目有一个需求就是在用户提交需求后如果24小时内还没有人审核,那么就自动通过审核,也就是需要数据库自动将转状态更新为 “已审核”,基于此需要了解MySQL数据库的事件用法。

我打算在事件里调存储过程,首先创建存储过程auto_pass_order:

DELIMITER //
create procedure auto_pass_order()
BEGIN
     update g_groupbuy_record set status = '01' where uids in (select uids from (select uids from g_groupbuy_record where CONVERT_TZ(now(), '+00:00', '+08:00') > adddate(create_time,interval 1 day) and status = '00') A);
END  //
DELIMITER ;
/* 由于公司数据库时间设置的默认UTC所以上面+8无需理会 */

存储过程是这个事件执行的实体,所以存储过程要好好测试好再放到事件里面去。

执行存储过程看看效果:

call auto_pass_order();

确定存储过程能正常使用后,开始创建事件:

DROP EVENT IF EXISTS auto_pass_event;
CREATE EVENT auto_pass_event
 ON SCHEDULE EVERY 60 second
DO
  CALL auto_pass_order();
/* 我这里需要分钟级的更新 60 second */

存储过程和事件创建完成了,但是,要让事件自动60秒执行一次还有好几步:

(1)启用MySQL的事件event(可以理解成数据库事件开关):

  查看event是否启用:

  show variables like 'event_scheduler';

  

  可以看到这里MySQL数据库未启用event事件,所以执行命令启用:

  set global event_scheduler='on';

到这里,数据库层的event开关就打开了。

(2)启用所创建的事件(可以理解成单个事件event的开关)

/* 开启事件 */
alter event auto_pass_event on completion preserve enable;

到这里,这个事件就可以正常运行了,实现的功能是:将下单后一天内还没有管理员审核的订单自动通过审核。

——————————————————华丽的分割线——————————————————

最后,有始有终,事件的关闭(存在数据库但不执行了):

/* 关闭事件——存在数据库但不执行 */
alter event auto_pass_event on completion preserve disable;

/* 删除事件——从数据库中删除     */
drop event if exists auto_check_event

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值