【问题标题】:When the transaction will be committed?何时提交事务?
【发布时间】:2018-11-14 09:56:21
【问题描述】:

我需要一些关于 Spring 转换的说明。 在ClassA 中,我正在创建一个声明性事务。从ClassA 我打电话给method1()ClassBClassB 在类级别有 @Transactional(propagation = Propagation.REQUIRED) 注释。 在method1()我正在做一个保存操作。

我的问题是,何时提交这些数据?它会在控制权出来的时候被提交吗 method1()?或在ClassA 我们手动提交事务的地方?

代码:

A 类

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);
        }
    }

}

B 类

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

void method1() {

//doing save operation

}
}

【问题讨论】:

    标签: java spring spring-transactions


    【解决方案1】:

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

    • AB 都是 Spring bean 吗?
    • AB 中的事务使用的 transactionManager bean 是否相同?
    • 如果A 是使用TransactionTemplate 而不是普通的TransactionManager 对象编写的。

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

    【讨论】:

    • 所以你说它将在下一行提交? transactionManager.commit(status);
    • @Rehman 我猜这将是在b.method1(); 完成执行之后。虽然这是一个猜测,如果你能通过测试证明我错了,我会很高兴。您省略了很多代码,例如是AB 春豆吗?
    • A 和 B 都是春豆。 B 没有使用任何事务管理器。它具有类级别的事务注释。
    • B 使用 @Transactional 和默认的 transactionManager 属性值(检查注释源代码)。声明式事务总是有一个事务管理器,但如果不查看完整的 Spring 上下文,就不可能知道它是什么。
    • 嗯。我会看一下。我的理解也与您在回答中提到的一致。但是当我看到日志时,这个理论并不适合。在我的应用程序中,一个线程更新值并从该方法method1()中出来。稍后当其他线程获取数据时,它的记录会变旧,而不是最新记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多