前言
当我们需要在事务控制的service层类中使用try catch 去捕获异常后,就会使事务控制失效,因为该类的异常并没有抛出,就不是触发事务管理机制。怎样才能即使用try catch去捕获异常,而又让出现异常后spring回滚呢,这里就要用到spring事务手动回滚。
代码示例
如图,aa()方法上使用了@Transactional注解后,如果操作app_user_in_activity这张表新增不成功,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();会导致aa()方法中的回滚,但是不会影响app_gift_activity这张表的插入。
如果@Transactional是标注在类上呢,会有怎么样的效果,,,
如图:
如果操作app_user_in_activity这张表新增不成功触发了回滚,app_gift_activity这张表插入也会一起回滚。
需注意的点
当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性。
@Transactional 加于private方法, 无效。
@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。