事务管理-事务进阶-propagation属性

目录

事务属性-传播行为

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 指定出现任何异常都回滚事务
            @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事务的影响,都会执行并且提交)

小结

  • REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录重。
  • REQUIRED :大部分情况下使用该传播行为即可

 

你可能感兴趣的:(Java,Web学习跟踪笔记,数据库,java,mysql)