我有三个方法,定义如下。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
在不同用例的多个地方使用,所以我不允许这样做。
我已经检查了这个问题,但methodX
0是一个接口,我不确定如何处理其余未实现的方法。
所以我想,与其在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(
方法是否通过。希望你能得到正确的答案