事务的失效场景
事务的失效场景
1.数据库是否支持事务(mysql的MyIsam不支持事务)
2.注解所在的类是否被加载成Bean
3.注解所在方法是否被修饰为public
4.是否发生自调用问题
5.所用数据源是否加载了事务管理器
6.扩展配置propagation是否正确
7.异常被捕获
8.异常抛出类型不对
其实发生最多就是自身调用、异常被吃、异常抛出类型不对这三个了。
<!--rollback-for 在该方法中有异常则进行回滚--> <tx:method name="*add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
在aop配置事务控制或注解 @Transactional控制事务中,try...catch...会使事务失效,那么如何解决呢?
1.可在catch中抛出运行时异常throw new RuntimeException(e)(注:默认回滚的是RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下)
2.手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),使得事务生效,出现异常回滚。
@Transactional(rollbackFor = Exception.class) public Result update(@RequestBody RestaurantVo entity) { Result result = new Result(); try { //save(entity); } catch (Exception e) { //throw new RuntimeException(e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return result.error(Result.CODE_ADD_FAILED + ":" + e.getMessage()); } return result;