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()出来。稍后,当其他线程获取数据时,它将获取旧记录,而不是最新记录。