说明:源于博主的思考,本文验证一下声明式注解,即@Transactional
注解,对XXL-JOB的定时任务是否生效。
准备
首先,创建一个需要事务的场景。有两张表,一张部门表,一张用户表,用户隶属于某个部门。当删除部门时,该部门下的用户也需要全部删除。
(User,用户对象)
import lombok.Data;
import java.io.Serializable;/*** 用户实体类*/
@Data
public class User implements Serializable {/*** 用户ID*/private Integer id;/*** 用户名*/private String username;/*** 用户密码*/private String password;/*** 用户隶属于哪个部门*/private Integer departId;
}
(Department,部门对象)
import lombok.Data;import java.io.Serializable;/*** 部门实体类*/
@Data
public class Department implements Serializable {/*** 部门ID*/private Integer id;/*** 部门名称*/private String name;
}
删除记录对应的Mapper方法;
(根据部门ID删除用户)
<delete id="deleteUserByDepartId" parameterType="int">delete from tb_user where depart_id = #{id}</delete>
(根据ID删除部门)
<delete id="deleteDepartmentById" parameterType="int">delete from tb_dep where id = #{id}</delete>
(定时任务代码:删除部门,同时删除部门下的所有用户)
@XxlJob("deleteDepartmentById")@Transactional(rollbackFor = Exception.class)public void deleteDepartmentById() {System.out.println("====================定时任务开始执行====================");// 删除部门ID为1的记录departmentService.deleteDepartmentById(1);System.out.println("====================删除部门完成====================");// 手动制造异常System.out.println(1/ 0);// 删除部门下的用户userService.deleteUserByDepartId(1);System.out.println("====================删除部门下的用户完成====================");}
对应的表内容
启动
打开XXL-JOB后台,找到这个定时任务,执行一次。
查看控制台,可以看到删除部门的SQL有打印出来;
查看数据库,部门没有删掉,说明事务起作用了。
去掉注解,再试下。
部门被成功删掉了,说明代码是没问题的。
总结
声明式注解对XXL-JOB的定时任务代码是有效的。