通过MySQL事件创建定时任务

作者: 乘风御上者 分类: MySQL 发布时间: 2020-07-18 16:47

在项目中我一般都是通过框架结合系统去实现项目的定时任务,偶然发现有前辈使用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

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复