Spring 事务传播和自调用行为

为了方便讲解,这里的A、B、C类都是Spring管理的Bean。

自调用行为

自调用行为示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
​
@Component
public class B {
    @Autowired
    public void b() {
        this.c();
    }
    
    @Transactional
    public void c() {
​
    }
}

不生效的原因

代码示例 B.b() 直接调用 B.c() 是一个典型的自调用情况。在这种情况下,即使 B.c() 方法有 @Transactional 注解,由于是在同一个类的内部直接调用,事务注解不会被 Spring 的代理机制捕获,因此不会生效。

在 Spring 的 AOP(面向切面编程)架构中,事务管理是通过代理(Proxy)来实现的。当一个方法被调用时,如果这个方法从外部(即通过 Spring 容器管理的 Bean)调用,并且配置了 @Transactional,Spring 会通过代理来拦截这个调用,然后根据 @Transactional 的属性来开始、加入、挂起或结束事务。但如果这个调用是从同一个类的内部发生的,比如一个方法直接调用同一个类中的另一个方法,这种调用就不会经过代理,Spring 无法施加事务管理的逻辑。

自调用行为解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值