事务因Propagation.REQUIRES_NEW导致的bug分析

本文深入讨论了不同场景下方法间数据可见性的问题,特别是在多事务环境下。通过五个具体示例,详细解析了方法调用时如何正确配置事务传播属性以确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发时候,遇到一个奇葩问题,单独部署(3情况)不会出现bug,而合并打包(4情况)时候,反而出现异常
先说明下,方法A、B、C、D方法不在一个类内,否则会导致AOP失效

	@Transactional
	public void A() {

	}

	@Transactional
	public void B() {

	}

	@Transactional
	public void C() {
    	A();
   	 	B();
	}

1)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,因为AB在C方法中,是在一个事务内

    @Transactional
    public void A() {

    }

    @Transactional
    public void B() {

    }

    public void C() {
        A();
        B();
    }

2)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,虽然A、B不在一个事务内,但是调用B方法是,A方法的事务已经提交

    @Transactional
    public void A() {

    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void B() {

    }

    public void C() {
        A();
        B();
    }

3)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,本质和2)一样

    @Transactional
    public void A() {

    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void B() {

    }
	
    @Transactional
    public void C() {
        A();
        B();
    }

4)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
不可以,C和A是一个事务,B事务单独,因为C在调B方法时,C事务并没有提交,所以B方法内查不到A方法内保存的数据

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void A() {

    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void B() {

    }
	
    @Transactional
    public void C() {
        A();
        B();
    }

5)以上方法,在C方法调用时,B方法可以查到A方法的保存的数据不?
可以的,因为A和B都是单独的

具体该不该加事务,该加怎样的事务,都要具体问题具体考虑,不能因为需要实现一个功能,导致其他的bug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值