美文网首页
SpringBoot入门—事务管理

SpringBoot入门—事务管理

作者: 遇见编程 | 来源:发表于2024-06-30 08:10 被阅读0次

    1.什么是事务?

    事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败

    事务的操作主要有三步:

    1. 开启事务(一组操作开始前,开启事务):start transaction / begin ;
    2. 提交事务(这组操作全部成功后,提交事务):commit ;
    3. 回滚事务(中间任何一个操作出现异常,回滚事务):rollback ;

    2.如何使用?

    Transactional注解

    @Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

    @Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。

    @Transactional注解书写位置:

    • 方法
      当前方法交给spring进行事务管理

    • 当前类中所有的方法都交由spring进行事务管理
    • 接口
      接口下所有的实现类当中所有的方法都交给spring 进行事务管理

    例如:

    @Slf4j
    @Service
    public class DeptServiceImpl implements DeptService {
        @Autowired
        private DeptMapper deptMapper;
    
        @Autowired
        private EmpMapper empMapper;
    
        
        @Override
        @Transactional  //当前方法添加了事务管理
        public void delete(Integer id){
            //根据部门id删除部门信息
            deptMapper.deleteById(id);
            
            //模拟:异常发生
            int i = 1/0;
    
            //删除部门下的所有员工信息
            empMapper.deleteByDeptId(id);   
        }
    }
    

    添加Spring事务管理后,由于服务端程序引发了异常,所以事务进行回滚
    说明:可以在application.yml配置文件中开启事务管理日志,这样就可以在控制看到和事务相关的日志信息了

    #spring事务管理日志
    logging:
      level:
        org.springframework.jdbc.support.JdbcTransactionManager: debug
    

    3.@Transactional注解当中的两个常见的属性

    1. 异常回滚的属性:rollbackFor
    2. 事务传播行为:propagation

    3.1 rollbackFor

    默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。
    假如我们想让所有的异常都回滚,需要来配置@Transactional注解当中的rollbackFor属性,通过rollbackFor这个属性可以指定出现何种异常类型回滚事务。

    @Slf4j
    @Service
    public class DeptServiceImpl implements DeptService {
        @Autowired
        private DeptMapper deptMapper;
    
        @Autowired
        private EmpMapper empMapper;
    
        
        @Override
        @Transactional(rollbackFor=Exception.class)
        public void delete(Integer id){
            //根据部门id删除部门信息
            deptMapper.deleteById(id);
            
            //模拟:异常发生
            int num = id/0;
    
            //删除部门下的所有员工信息
            empMapper.deleteByDeptId(id);   
        }
    }
    

    结论:

    • 在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。
    • 如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定。

    3.2 propagation

    这个属性是用来配置事务的传播行为的
    就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

    所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?这个就涉及到了事务的传播行为。

    我们要想控制事务的传播行为,在@Transactional注解的后面指定一个属性propagation,通过 propagation 属性来指定传播行为。

    属性值 含义
    REQUIRED 【默认值】需要事务,有则加入,无则创建新事务
    REQUIRES_NEW 需要新事务,无论有无,总是创建新事务
    SUPPORTS 支持事务,有则加入,无则在无事务状态中运行
    NOT_SUPPORTED 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
    MANDATORY 必须有事务,否则抛异常
    NEVER 必须没事务,否则抛异常

    对于这些事务传播行为,我们只需要关注以下两个就可以了:

    1. REQUIRED(默认值)
    2. REQUIRES_NEW
    @Service
    public class DeptLogServiceImpl implements DeptLogService {
    
        @Autowired
        private DeptLogMapper deptLogMapper;
    
        @Transactional(propagation = Propagation.REQUIRES_NEW)//事务传播行为:不论是否有事务,都新建事务
        @Override
        public void insert(DeptLog deptLog) {
            deptLogMapper.insert(deptLog);
        }
    }
    

    到此事务传播行为已演示完成,事务的传播行为我们只需要掌握两个:REQUIRED、REQUIRES_NEW。

    • REQUIRED :大部分情况下都是用该传播行为即可。

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

    相关文章

      网友评论

          本文标题:SpringBoot入门—事务管理

          本文链接:https://www.haomeiwen.com/subject/vhsycjtx.html