以我的理解,以下代码中的newPrint方法应该创建一个新事务,但是显然,它打印出与oldPrint方法中使用的相同的事务状态对象。我从另一个班级打电话给oldPrint。是因为使用this调用了newPrint吗?如果是,那么何时创建新交易?如果我从另一个类调用这两个方法,则无论如何都会创建两个单独的事务,因为在类级别使用了@Transactional

@Transactional
public class Unsubcriber {


    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void newPrint() {
        System.out.println(TransactionAspectSupport.currentTransactionStatus());
    }

    public void oldPrint() {

        System.out.println(TransactionAspectSupport.currentTransactionStatus());
        newPrint();
    }


输出:

org.springframework.transaction.support.DefaultTransactionStatus@3bacd0e7
org.springframework.transaction.support.DefaultTransactionStatus@3bacd0e7


Propagation.REQUIRES_NEW可以工作的情况是什么?

最佳答案

您看到的是关于Spring AOP的类误解。

由于newPrint()是从同一类内部的方法调用的,因此不会触发任何建议,因此不会进行任何事务处理。

如果您在类之外调用方法newPrint(),则无论调用者是否已参与事务,都会创建一个新事务。

由于您在类中使用了@Transactional,因此每个方法均具有默认的@Transactional设置,这就是为什么您实际上有事务的原因。

请参阅Spring参考文档的this部分,以详细讨论AOP在Spring中的工作方式。

要使您的代码像您期望的那样正常工作,总的骇客如下:

((Unsubcriber ) AopContext.currentProxy()).newPrint();


this SO post的各个地方都提到了此解决方案。

10-08 04:00