SpringBoot 事务开发代码及注意事项
文章目录
- 1. 编码
- 2. @Transactional属性
- 2.1 value
- 2.2 propagation
- 2.3 isolation
- 2.4 timeout
- 2.5 readOnly
- 2.6 `rollbackFor`
- 2.7 noRollbackFor
- 3. 注意 :
1. 编码
在使用SpringBoot集成Mybatis完成事务操作时,底层其实还是jdbc的 DataSourceTransactionManager,并且在SpringBoot启动时自动进行配置,只要我们告诉SpringBoot我们将要使用事务,它就可以为我们自动配置。
只需要两步就可以完成 :
-
在启动类或某个配置类加上
@EnableTransactionManagement
注解。// 1.在启动类上加: @SpringBootApplication @EnableTransactionManagement public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } } // 2.在配置类上加: @Configuration @EnableTransactionManagement public class TransactionManagerConfig { }
-
在需要开启事务的地方加上
@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 | 所有事物依次执行(严重影响性能) |
2.4 timeout
设置事物的超时时间,默认值为 -1,如果超过该时间事务还未执行完毕,自动回滚事务。
2.5 readOnly
指定事务是否为只读事务,默认值为false;为了忽略哪些不需要事务的方法。
2.6 rollbackFor
重要且常用,指定触发什么异常时才会执行事务的回滚。可以指定多个。属性是Class对象数组
2.7 noRollbackFor
指定哪些异常抛出时不会进行事务回滚。
3. 注意 :
1、@Transactional 注解只被应用在 public 方法上,用在protected、private 上时不会报错,单没用。
2、默认情况下,只有来自外部的调用才会被aop捕获,即:类内部方法互相调用不会引起事务行为。