Java 删除/忽略当前事务并使用即将到来的事务(如果可用)
我有3个方法,定义如下Java 删除/忽略当前事务并使用即将到来的事务(如果可用),java,spring,transactions,Java,Spring,Transactions,我有3个方法,定义如下methodX和methodY在不同的类中定义methodY和MethodsAsync在同一类中定义 @Transactional(propagation = Propagation.REQUIRED) public void methodX(){ ..... methodY(); methodZAsync(); // } @Transactional(propagation = Propagation.REQUIRED) public void
methodX
和methodY
在不同的类中定义methodY
和MethodsAsync
在同一类中定义
@Transactional(propagation = Propagation.REQUIRED)
public void methodX(){
.....
methodY();
methodZAsync(); //
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodY(){
.....
someDatabaseOperations();
.....
}
@Async
public void methodZAsync(){
.....
pollingBasedOnDataOperationsOfMethodY();
.....
}
这里的问题是,MethodsAsync需要提交methodY()
的数据库操作,然后才能开始工作。这会失败,因为methodZAsync
在不同的线程中运行
一个选项是使methodY
的事务使用@Transactional(propagation=propagation.REQUIRES\u NEW)
。但是由于methodY
在不同用例的多个地方使用,我不允许这样做
我已经检查过了,但是TransactionSynchronization
是一个接口,我不确定如何处理其余未实现的方法
所以我想,与其在methodY()
中进行更改,不如让methodX()
告诉methodY()
使用一个新事务(天真的方式:关闭当前正在运行的事务),它会帮我解决问题
这是否可以从
methodX()
执行,而无需修改methodY()
?参考spring boot,还有
@事务性(传播=传播。需要\u新建)
方法都有经过。希望您能得到正确的答案您可以围绕methodY()创建一个新的包装器方法来创建一个新事务。然后您可以从methodX()调用这个新方法,而不影响任何其他用例
@Transactional(propagation = Propagation.REQUIRED)
public void methodX(){
.....
methodYInNewTxn();
methodZAsync(); //
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodYInNewTxn() {
methodY();
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodY(){
.....
someDatabaseOperations();
.....
}