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

Drop / ignore current transaction and use upcoming transaction if available

我有 3 个方法定义如下。 methodXmethodY 在不同的 class 中定义。 methodYmethodZAsync 在相同的 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();
    .....
}