From e7fd3b0c187bc38e41ae07464d903f4486703c18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=87=E5=A1=9E=E5=A4=A7=E5=98=B4=E5=A5=BD=E5=B8=A5?= <66861267+DaZuiZui@users.noreply.github.com> Date: Mon, 12 Jun 2023 23:13:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E9=87=8A=E4=BA=86SpringAOP=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E5=8E=9F=E7=90=86=E6=98=AF=E5=A6=82=E4=BD=95=E5=AF=BC?= =?UTF-8?q?=E8=87=B4@Transaction=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解释了SpringAOP工作原理是如何导致@Transaction失效 --- docs/system-design/framework/spring/spring-transaction.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index 2b1a8e33..21771c66 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -654,10 +654,10 @@ public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { > `TransactionInterceptor` 类中的 `invoke()`方法内部实际调用的是 `TransactionAspectSupport` 类的 `invokeWithinTransaction()`方法。由于新版本的 Spring 对这部分重写很大,而且用到了很多响应式编程的知识,这里就不列源码了。 #### Spring AOP 自调用问题 +因为SpringAOP工作原理导致@Transaction失效 。 +当一个方法被标记了@Transactional注解的时候,Spring事务管理器只会在被其他类方法调用的时候生效,而不会在一个类中方法调用生效。 -若同一类中的其他没有 `@Transactional` 注解的方法内部调用有 `@Transactional` 注解的方法,有`@Transactional` 注解的方法的事务会失效。 - -这是由于`Spring AOP`代理的原因造成的,因为只有当 `@Transactional` 注解的方法在类以外被调用的时候,Spring 事务管理才生效。 +这是因为Spring AOP工作原理决定的。因为Spring AOP使用动态代理来实现事务的管理,他会在运行的时候为带有@Transaction注解的方法生成代理对象,并在方法调用的前后应用事物逻辑。如果该方法被其他类调用我们的代理对象就会拦截方法调用并处理事物。但是在一个类中的其他方法内部调用的时候我们代理对象就无法拦截到这个内部调用,因此事物也就失效了。 `MyService` 类中的`method1()`调用`method2()`就会导致`method2()`的事务失效。