SpringBoot声明式事务和手动事务

声明式事务(注解)

  1. 在启动类中加上@EnableTransactionManagement注解,开启注解事务 spring boot应该会自动开启注解事务配置,这里没有试验过,加上注解准没错 @SpringBootApplication @EnableTransactionManagement public class AppStarter{ public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(AppStarter.class, args); } }
  2. 在需要使用事务管理的方法上加上@Transactional注解即可实现事务管理
  3. 事务失效的情况 (1)类内部方法调用 AService中有一个方法 A,调用了AService的方法 B, 方法 A 没有事务管理,方法 B 采用了声明式事 务,在方法 A 中调用方法 B,实际上是通过“this”的引用,也就是直接调用了目标类的方法,而非通过 Spring 上下文获得的代理类,所以事务不会开启。 Spring的声明式事务是通过AOP实现的,会产生一个代理类来做事务管理,因此必须使用注入的对象(代理对象)调用才会生效。采用声明式事务的方法执行前,会先通过拦截器TransactionInterceptor开启事务,然后才被调用执行,执行结束后,TransactionInterceptor 会提交或回滚事务 (2)抛出了checked异常 在默认配置的情况下,所有的 checked 异常都不会引起事务回滚。 注:Unchecked Exception包括Error与RuntimeException. RuntimeException的所有子类也都属于此类。另一类就是checked Exception。 可以通过指定回滚异常来解决: @Transactional(rollbackForClassName={ "Exception"}) 或者 @Transactional(rollbackFor={ Exception.class}) 也可以指定不回滚的异常: @Transactional(noRollbackForClassName={ "InstrumentNotFoundException"}) 或者 @Transactional(noRollbackFor={ InstrumentNotFoundException.class})

手动提交事务

  1. 注入两个对象 @Autowired DataSourceTransactionManager dataSourceTransactionManager; @Autowired TransactionDefinition transactionDefinition;
  2. 事务使用方法 //手动开启事务 TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); //手动提交事务 dataSourceTransactionManager.commit(transactionStatus);//提交 //手动回滚事务 dataSourceTransactionManager.rollback(transactionStatus);//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交
经验分享 程序员 微信小程序 职场和发展