有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring传播。需要新的

据我所知,下面代码中的newPrint方法应该创建一个新事务,但显然它打印出了与oldPrint方法中使用的相同的事务状态对象。我从另一个班打电话给oldPrint。是因为newPrint是使用this调用的吗?如果是,那么何时创建新事务?如果我从另一个类调用这两个方法,无论如何都会创建两个单独的事务,因为@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起作用时,会出现什么情况


共 (2) 个答案

  1. # 1 楼答案

    假设geoand的编辑澄清是真的,那么您的问题的答案是Spring使用AOP代理来应用事务限制。所以,当来自外部的呼叫进入你的退订者时,这将起作用,然后可以拦截这些呼叫,并应用事务边界。如果你从你的类中调用它,就像你说的,使用“this”,那么就没有代理可以完成,因此你的@Transactional将不会发挥作用

  2. # 2 楼答案

    你看到的是一个关于Spring AOP的班级误解

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

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

    因为您在类上使用了@Transactional,所以每个方法都会得到默认的@Transactional设置,这就是为什么您实际上有一个事务

    查看Spring参考文档的this部分,详细讨论AOP在Spring中的工作方式

    要让你的代码像你期望的那样工作,一个彻底的黑客攻击是:

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

    这个解决方案在许多地方都有提及,其中就有thisSO post