目录
事务属性-传播行为
propagation
案例
需求
步骤
具体代码
小结
事务属性-传播行为
-
propagation
- 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。即如果事务方法A中调用了事务方法B,那么事务方法B是加入A事务方法还是新建一个事务。
-
事务传播行为 描述 REQUIRED(默认值) 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。(若A事务回滚,则B事务也会回滚)
SUPPORTS 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。 MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 REQUIRES_NEW 创建一个新事务,并挂起当前事务(如果存在)(若A事务回滚,B事务不受影响继续执行)。 NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,则挂起该事务。 NEVER 以非事务方式执行操作,如果当前存在事务,则抛出异常。 NESTED 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新事务。
案例
-
需求
- 解散部门时,无论成功还是失败,都要记录操作日志
-
步骤
- 解散部门:删除部门、删除部门下的员工
- 记录日志到数据库表中
-
具体代码
- A事务
- 根据部门ID删除部门信息并且删除员工信息
-
@Transactional(rollbackFor = Exception.class) // todo 将deleteByID(Integer ID)方法交给Spring事务管理,以确保数据的一致性和完整性// todo 指定出现任何异常都回滚事务@Overridepublic void deleteByID(Integer id) {try {deptMapper.deleteByID(id);id = 1 / 0;empMapper.DeleteByDeptID(id);} finally {// todo 记录操作日志DeptLog deptLog = new DeptLog();deptLog.setCreateTime(LocalDateTime.now());deptLog.setDescription("执行了解散部门的操作,部门id为" + id + "的部门已经解散");deptLogService.insert(deptLog);}}
-
B事务
-
记录删除员工信息的日志
-
@Service public class DeptLogServiceImpl implements DeptLogService {@Autowiredprivate DeptLogMapper deptLogMapper;@Transactional(propagation = Propagation.REQUIRES_NEW)@Overridepublic void insert(DeptLog deptLog) {deptLogMapper.insert(deptLog);} }
-
在该接口实现类中添加了 @Transactionalb注解,将该类注册为一个事务,并且设置属性propagation的值(不受A事务的影响,都会执行并且提交)
-
- A事务
小结
-
REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录重。
-
REQUIRED :大部分情况下使用该传播行为即可