需求: 订单状态 待支付订单 订单时间等于或超过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