SpringBoot 事务开发代码及注意事项

发布于:2023-01-04 ⋅ 阅读:(546) ⋅ 点赞:(0)

1. 编码

在使用SpringBoot集成Mybatis完成事务操作时,底层其实还是jdbc的 DataSourceTransactionManager,并且在SpringBoot启动时自动进行配置,只要我们告诉SpringBoot我们将要使用事务,它就可以为我们自动配置。
只需要两步就可以完成 :

  1. 在启动类或某个配置类加上 @EnableTransactionManagement注解。

    // 1.在启动类上加:
    @SpringBootApplication
    @EnableTransactionManagement
    public class TestApplication {
        public static void main(String[] args) {
            SpringApplication.run(TestApplication.class, args);
        }
    }
    // 2.在配置类上加:
    @Configuration
    @EnableTransactionManagement
    public class TransactionManagerConfig {
        
    }
    
  2. 在需要开启事务的地方加上 @Transactional 注解

    可以加在类上,也可以加在方法上。

    // 加在类上时,默认所有方法使用事务。
    @Transactional
    public class xxx {
        public void add() {
    
        }
        public void delete() {
    
        }
        public void update() {
    
        }
    }
    
    

2. @Transactional属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYuAFQ7L-1661881776696)(https://xiaohetypora.oss-cn-shanghai.aliyuncs.com/QQ%E5%9B%BE%E7%89%8720220830235200.jpg)]

2.1 value

类型是String,当配置了多个事务管理器,使用该属性选择使用哪一个。

与transactionManager属性作用相同。

2.2 propagation

类型是枚举类,选择事务传播行为,默认值为propagation.REQUIRED。

属性如下表:

属性值 作用
propagation.REQUIRED 默认值,如果当前存在事务,则加入该事务;如果不存在则新建。
propagation.SUPPORTS 如果当前存在事务,则加入该事务;如果不存在,则以非事务方式运行
propagation.MANDATORY 如果当前存在事务,则加入该事务;如果不存在则抛出异常
propagation.REQUIRES_NEW 重新创建一个新的事务,如果当前存在事务,暂停当前的事务
propagation.NOT_SUPPORTED 以非事务的方式运行,如果当前存在事务,停止当前事务
propagation.NEVER 以非事务的方式运行,如果当前存在事务,抛出异常
propagation.NESTED 如果当前存在事务,则加入该事务;如果不存在则新建。

2.3 isolation

类型是枚举类,事物的隔离级别,默认值为 isolation.DEFAULT

属性如下图:

属性值 作用
isolation.DEFAULT 使用底层数据库的默认隔离级别,对于大多数数据库而言是READ_COMMITED
isolation.READ_COMMITED 一个事务只能读取另一个事务已经提交的数据
isolation.READ_UNCOMMITED 一个事务可以读取另一个事务修改但还未提交的数据
isolation.REPEATABLE_READ 一个事务在进行多次重复查询操作时,忽略别的事务新增数据造成的影响
isolation.SERIALIZABLE 所有事物依次执行(严重影响性能)

image-20220831005031040

2.4 timeout

设置事物的超时时间,默认值为 -1,如果超过该时间事务还未执行完毕,自动回滚事务。

2.5 readOnly

指定事务是否为只读事务,默认值为false;为了忽略哪些不需要事务的方法。

2.6 rollbackFor

重要且常用,指定触发什么异常时才会执行事务的回滚。可以指定多个。属性是Class对象数组

2.7 noRollbackFor

指定哪些异常抛出时不会进行事务回滚。

3. 注意 :

1、@Transactional 注解只被应用在 public 方法上,用在protected、private 上时不会报错,单没用。

2、默认情况下,只有来自外部的调用才会被aop捕获,即:类内部方法互相调用不会引起事务行为。


网站公告

今日签到

点亮在社区的每一天
去签到