通过MySQL事件创建定时任务
在项目中我一般都是通过框架结合系统去实现项目的定时任务,偶然发现有前辈使用MySQL事件实现同样的功能。 消除了PHP框架执行、与数据库交互的损耗,可能效率会高很多。
正好在项目上需要一个优惠券实时检测过期功能,就尝试使用MySQL事件实现一下,具体的得与失需要时间的考验。
以前对MySQL事件、存储过程等接触比较少,所以功能实现的比较简单。实现方式有很多种,此处只做思路展示。
# 简单的设置可以在Navicat中创建
# 需要注意执行权限
# 定义者:`root`@`localhost`
# ON COMPLETION: PRESERVE
# 该项目需要五分钟执行一次,所以设置计划 EVERY: 300 SECOND
# 坑:EVERY直接设置 5 MINUTE 可能会不起作用
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE couid INT DEFAULT 0;
# 找到所有正常的优惠券但时间已过期的
DECLARE coupon_ids CURSOR FOR select id from `coupon` where `status` = 1 and `end_time` < UNIX_TIMESTAMP();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET i = 0;
# 打开游标
OPEN coupon_ids;
# 遍历游标
WHILE i <> 0 DO
# 读取游标
FETCH coupon_ids into couid;
# 更新优惠券状态
UPDATE `coupon` SET `status`= 0 WHERE `id` = couid;
# 更新用户持有的该优惠券,若没有使用则更新成过期
UPDATE `user_coupon` SET `status` = 2 WHERE `status` = 0 AND `coupon_id` = couid;
END WHILE;
CLOSE coupon_ids;
END