删除/忽略当前事务,并使用即将到来的事务(如果可用)



我有三个方法,定义如下。CCD_ 1和CCD_。CCD_ 3和CCD_。

@Transactional(propagation = Propagation.REQUIRED)
public void methodX(){
.....
methodY();
methodZAsync(); //
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodY(){
.....
someDatabaseOperations();
.....
}

@Async
public void methodZAsync(){
.....
pollingBasedOnDataOperationsOfMethodY();
.....
}

这里的问题是,methodZAsync需要先提交methodY()的DB操作,然后才能开始工作。这是因为methodZAsync在不同的线程中运行而失败的。

一种选择是使methodY的事务使用@Transactional(propagation = Propagation.REQUIRES_NEW)。但是由于methodY在不同用例的多个地方使用,所以我不允许这样做。

我已经检查了这个问题,但methodX0是一个接口,我不确定如何处理其余未实现的方法。

所以我想,与其在methodY()中进行更改,如果我能以某种方式使methodX()告诉methodY()使用一个新的事务(天真的方式:关闭当前正在运行的事务(,它会为我解决问题。

这在methodX()中是否可行,而无需修改methodY()

您可以围绕创建新事务的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();
.....
}

参考弹簧靴,还有

@Transactional(propagation=propagation.REQUIRES_NEW(

方法是否通过。希望你能得到正确的答案

相关内容

最新更新