说明:本文验证一下声明式注解,即@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的定时任务代码是有效的。