Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时提交事务?_Java_Spring_Spring Transactions - Fatal编程技术网

Java 何时提交事务?

Java 何时提交事务?,java,spring,spring-transactions,Java,Spring,Spring Transactions,我需要一些关于春季交易的澄清。 在ClassA中,我正在创建一个去极化事务。从ClassA我正在调用ClassB的method1()。 ClassB在类级别具有@Transactional(propagation=propagation.REQUIRED)注释。 在method1()中,我正在执行一个保存操作 我的问题是,何时提交这些数据?它会在控制权从你那里出来的时候被提交吗 method1()?或者在ClassA中手动提交交易 代码: ClassA class ClassA { v

我需要一些关于春季交易的澄清。 在
ClassA
中,我正在创建一个去极化事务。从
ClassA
我正在调用
ClassB
method1()。
ClassB
在类级别具有
@Transactional(propagation=propagation.REQUIRED)
注释。 在
method1()
中,我正在执行一个保存操作

我的问题是,何时提交这些数据?它会在控制权从你那里出来的时候被提交吗
method1()
?或者在
ClassA
中手动提交交易

代码:

ClassA

class ClassA {

    void myMethod() {
        TransactionStatus status = null;
        DefaultTransactionDefinition def =
                new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        def.setTimeout(contentFileProcessingConfigBean.getFileCopyTransactionTimeout());
        status = transactionManager.getTransaction(def);

        b.method1();

        if (status != null) {
            transactionManager.commit(status);
        }
    }

}
ClassB

@Transactional(propagation = Propagation.REQUIRED)
class ClassB {

void method1() {

//doing save operation

}
}

可能在
B.method1()
完成包装调用
@Transactional
(在堆栈跟踪中可见)的方面后,将提交事务。然而,这将取决于:

  • A
    B
    都是春豆吗
  • A
    B
    中的事务使用的
    transactionManager
    bean是否相同
  • 如果使用
    TransactionManager
    对象而不是普通的
    TransactionManager
    对象来编写
    A
    ,则可能会发生这种情况

不建议混合使用手动和声明式事务管理,因为您必须猜测。我猜它会出现在
transactionManager中,而您没有显示它。

那么您会告诉我它将在下一行提交吗<代码>transactionManager.commit(状态)
@Rehman我猜它会在
b.method1()之后完成执行。不过这只是猜测,如果你能通过测试证明我错了,我会很高兴的。您省略了很多代码,例如,
a
B
springbean?a和B都是springbean。B没有使用任何transactionManager。它具有类级别的事务性注释。
B
正在使用
@Transactional
和默认的
transactionManager
属性值(检查注释源代码)。声明性事务总是有一个事务管理器,但是如果不查看完整的Spring上下文,就不可能知道它是什么。我去看看。我的理解也与你在回答中提到的相同。但当我看到日志时,这个理论并不适用于此。在我的应用程序中,一个线程更新值并从该方法method1()出来。稍后,当其他线程获取数据时,它将获取旧记录,而不是最新记录。