@Transactional注解

@Transactional 的作用范围方法:

https://javaguide.cn/system-design/framework/spring/spring-transaction.html#transactional-注解使用详解

  1. 方法:推荐将注解使用于方法上,不过需要注意的是:该注解只能应用到 public 方法上,否则不生效。
  2. 类:如果这个注解使用在类上的话,表明该注解对该类中所有的 public 方法都生效。
  3. 接口:不推荐在接口上使用。

@Transactional 事务注解原理

@Transactional 的工作机制是基于 AOP 实现的,
AOP 又是使用动态代理实现的。

  • 如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,
  • 如果目标对象没有实现了接口,会使用 CGLIB 动态代理。

如果一个类或者一个类中的 public 方法上被标注@Transactional 注解的话,Spring 容器就会在启动的时候为其创建一个代理类,
在调用被@Transactional 注解的 public 方法的时候,实际调用的是,TransactionInterceptor 类中的 invoke()方法。
这个方法的作用就是在目标方法之前开启事务,方法执行过程中如果遇到异常的时候回滚事务,方法调用完成之后提交事务。

TransactionInterceptor 类中的 invoke()方法内部实际调用的是 TransactionAspectSupport 类的 invokeWithinTransaction()方法。由于新版本的 Spring 对这部分重写很大,而且用到了很多响应式编程的知识,这里就不列源码了。

posted @ 2025-04-22 20:37  kuki'  阅读(50)  评论(0)    收藏  举报