目录
事务属性-传播行为
-
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 指定出现任何异常都回滚事务 @Override public 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 { @Autowired private DeptLogMapper deptLogMapper; @Transactional(propagation = Propagation.REQUIRES_NEW) @Override public void insert(DeptLog deptLog) { deptLogMapper.insert(deptLog); } } -
在该接口实现类中添加了 @Transactionalb注解,将该类注册为一个事务,并且设置属性propagation的值(不受A事务的影响,都会执行并且提交)
-
- A事务
小结
-
REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录重。
-
REQUIRED :大部分情况下使用该传播行为即可
本文讨论事务属性的传播行为,如何决定子事务与父事务的关系,举例说明了在解散部门操作中的事务处理。

3717

被折叠的 条评论
为什么被折叠?



