mysql定时任务自动取消订单

需求: 订单状态 待支付订单  订单时间等于或超过24小时自动取消 并记录执行的定时任务记录

使用mysql定时任务

创建存储过程  如果发生错误会自动回滚  执行成功会返回受影响行数

订单表sale_order就不展示了里面执行的sql 具体看你们业务

CREATE  PROCEDURE pro_upddate_sale_order(out update_count int(9))
	BEGIN
			DECLARE t_error INTEGER DEFAULT 0;-- 这里跟上面的写的不一样,但是需要在语句中根据t_error的值手动回滚下事务
			DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;
		 	START TRANSACTION;
			-- 等于或超过24小时的待支付订单自动取消
					UPDATE sale_order 
						SET order_status =- 1,
						update_time = NOW( ) 
					WHERE
						order_status = 0  -- 待支付
						AND timestampdiff( HOUR, create_time, NOW( ) ) >= 24 
						AND is_deleted = 0;
						select ROW_COUNT() into update_count;
					IF t_error = 1 THEN
						ROLLBACK;
					ELSE 
					    COMMIT;
					END IF;

	END;

创建定时任务公共存储过程用于调用其它存储过程  并且向插入执行的定时任务记录

CREATE  PROCEDURE job_procedures()
BEGIN
-- 等于或超过24小时的待支付订单自动取消
CALL pro_upddate_sale_order(@count);
  INSERT into sys_job(job_name,created_time,job_remark,update_count) values('job_procedures',NOW(),'等于或超过24小时的待支付订单自动取消',@count);
end;
	

sys_job表结构

CREATE TABLE `sys_job` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `job_name` varchar(100) CHARACTER SET latin1 DEFAULT NULL COMMENT '执行的job名称',
  `created_time` datetime DEFAULT NULL COMMENT '执行的时间',
  `is_delete` int(2) DEFAULT '0' COMMENT '0 未删除 1 已删除',
  `job_remark` varchar(2000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '任务描述备注',
  `update_count` int(9) DEFAULT '0' COMMENT '受影响行数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Mysql 定时任务执行描述'

创建定时任务 eventJob是定时任务名称

-- 2019-11-21 00:00:00启动定时器,每隔12小时执行一次
 create  EVENT if not exists eventJob 
  on schedule every 12 hour starts timestamp '2019-11-21 00:00:00' 
  on completion PRESERVE
  do call job_procedures();

开启事务 

-- 开启事务
ALTER EVENT eventJob ON  COMPLETION PRESERVE ENABLE;

启动定时器 

SET GLOBAL event_scheduler = 1;

查看定时器状态

SHOW VARIABLES LIKE '%sche%';

这样就完成了这个需求了 验证 过12小时后看看sys_job以及影响行数来判断是否执行成功

其它操作

-- 关闭事件
ALTER EVENT eventJob ON  COMPLETION PRESERVE DISABLE;

-- 停止定时器
SET GLOBAL event_scheduler = 0;

-- 设置定时器开机自启动

找到etc/my.cnf 打开 在[mysqld]底下添加 event_scheduler = 1;

-- MySQL 更新或插入后获取受影响行数

SELECT ROW_COUNT();

-- mysql 插入一条记录后获取插入记录的主键id

SELECT LAST_INSERT_ID();

参考文章:https://blog.csdn.net/cuiyaoqiang/article/details/80075224

               https://www.jianshu.com/p/91773f8375eb

猜你喜欢

转载自blog.csdn.net/qq_39313596/article/details/103180666
今日推荐