声明式事务(注解)
-
在启动类中加上@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); } } -
在需要使用事务管理的方法上加上@Transactional注解即可实现事务管理
-
事务失效的情况
(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})
手动提交事务
-
注入两个对象
@Autowired DataSourceTransactionManager dataSourceTransactionManager; @Autowired TransactionDefinition transactionDefinition; -
事务使用方法
//手动开启事务 TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); //手动提交事务 dataSourceTransactionManager.commit(transactionStatus);//提交 //手动回滚事务 dataSourceTransactionManager.rollback(transactionStatus);//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交
本文探讨了SpringBoot中的声明式事务管理,强调了启用@EnableTransactionManagement注解和@Transactional注解在方法上的使用。同时,指出了声明式事务在类内部调用和抛出checked异常时不生效的问题,并提供了相应的解决方案。此外,还简要提到了手动提交事务的相关内容。
1745

被折叠的 条评论
为什么被折叠?



