删除/忽略当前交易并使用即将到来的交易(如果可用)
Drop / ignore current transaction and use upcoming transaction if available
我有 3 个方法定义如下。 methodX
和 methodY
在不同的 class 中定义。 methodY
和 methodZAsync
在相同的 class.
中定义
@Transactional(propagation = Propagation.REQUIRED)
public void methodX(){
.....
methodY();
methodZAsync(); //
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodY(){
.....
someDatabaseOperations();
.....
}
@Async
public void methodZAsync(){
.....
pollingBasedOnDataOperationsOfMethodY();
.....
}
这里的问题是,methodZAsync 需要提交 methodY()
的数据库操作才能开始工作。这失败了,因为 methodZAsync
在不同的线程中运行。
一种选择是让 methodY
的交易使用 @Transactional(propagation = Propagation.REQUIRES_NEW)
。但是由于 methodY
在不同用例的多个地方使用,我不允许这样做。
我检查过 this question,但 TransactionSynchronization
是一个接口,我不确定如何处理其余未实现的方法。
所以我想,与其在 methodY()
中进行更改,不如让 methodX()
告诉 methodY()
使用新事务(天真的方式:关闭当前 运行 事务),它会为我解决问题。
这是否可以从 methodX()
开始而无需修改 methodY()
?
参考spring开机,还有
@Transactional(propagation = Propagation.REQUIRES_NEW)
方法有没有通过。希望你能得到正确的答案
您可以围绕 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();
.....
}
我有 3 个方法定义如下。 methodX
和 methodY
在不同的 class 中定义。 methodY
和 methodZAsync
在相同的 class.
@Transactional(propagation = Propagation.REQUIRED)
public void methodX(){
.....
methodY();
methodZAsync(); //
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodY(){
.....
someDatabaseOperations();
.....
}
@Async
public void methodZAsync(){
.....
pollingBasedOnDataOperationsOfMethodY();
.....
}
这里的问题是,methodZAsync 需要提交 methodY()
的数据库操作才能开始工作。这失败了,因为 methodZAsync
在不同的线程中运行。
一种选择是让 methodY
的交易使用 @Transactional(propagation = Propagation.REQUIRES_NEW)
。但是由于 methodY
在不同用例的多个地方使用,我不允许这样做。
我检查过 this question,但 TransactionSynchronization
是一个接口,我不确定如何处理其余未实现的方法。
所以我想,与其在 methodY()
中进行更改,不如让 methodX()
告诉 methodY()
使用新事务(天真的方式:关闭当前 运行 事务),它会为我解决问题。
这是否可以从 methodX()
开始而无需修改 methodY()
?
参考spring开机,还有
@Transactional(propagation = Propagation.REQUIRES_NEW)
方法有没有通过。希望你能得到正确的答案
您可以围绕 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();
.....
}