spring事务及失效场景及具体分析

spring事务一般采用注解实现,当然也可以用xml配置。
方法上加上@Transactional

在使用 Spring 事务时不能使用 try-catch 进行异常捕获,要将异常抛给外层,使其进行异常拦截,触发事务机制。
spring事务及失效场景及具体分析_第1张图片
spring事务在某些场景下会失效:

  1. 抛出检查型异常时事务失效,即写try catch异常失效
    Exception 受检查的异常:在程序中必须使用 try…catch 进行处理,遇到这种异常不处理,编译器会报错。例如 IOException 。

如果想实现只要抛出异常就回滚,可以通过添加注解 @Transactional(rollbackFor=Exception.class)
实现。

  1. 一个事务方法调用另一个事务方法时失效

因为Spring 的声明式事务使用了代理。此时必须指定事务应该如何传播,也就是传播行为
事务传播行为是为了解决业务层方法之间互相调用的事务问题

共有七种
@Transactional(propagation = Propagation.REQUIRED)
@Transactional(propagation = Propagation.REQUIRES_NEW)

补充说明:

  • MySQL 且引擎是 MyISAM,则事务会不起作用,原因是 MyISAM 不支持事务,改成 InnoDB 引擎则支持事务。
  • 注解 @Trasactional 只能加在 public 修饰的方法上事务才起效。如果加在 protect、private 等非
    public 修饰的方法上,事务将失效。
  • 如果在开启了事务的方法内,使用了 try-catch 语句块对异常进行了捕获,而没有将异常抛到外层,事务将不起效。
  • 不同类之间方法调用时,异常发生在无事务的方法A中,但不是被调用的方法B产生的,被调用的方法B的事务无效。只有异常发生在开启事务的方法B内,事务才有效。

Spring 事务是使用 AOP 代理,环绕通知和异常通知,就是对方法进行拦截,在方法执行前开启事务,在捕获到异常时进行事务回滚,在方法执行完成后提交事务。

你可能感兴趣的:(java,spring)