Java/Spring:如何使用 TransactionSynchronizationManager 指定嵌套事务的顺序



我有一些逻辑需要在事务提交后执行,所以我使用如下的东西:

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
//do work
}
});

这工作正常。我的问题是,如果我在嵌套事务中注册多个这样的处理程序,订单是否保证在注册顺序中?所以例如:

class Obj1 {
@Transactional
public void doTX1() {
//invoke another method that is marked as transactional
obj2.doInnerTx();
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
System.out.println("Outer TX");
}
});
}
}
class Obj2 {
@Transactional
public void doInnerTx() {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
System.out.println("Inner TX");
}
});
}
}

输出:

Inner TX
Outer TX

但这能保证吗?如果没有,我将如何执行命令,以便始终首先执行内部命令?

registerSynchronization(( 方法的 javadoc 说:

Note that synchronizations can implement the
* {@link org.springframework.core.Ordered} interface.
* They will be executed in an order according to their order value (if any)

如果使用 newTransactionSynchronizationAdapter() {..}而不是new TransactionSynchronization() {..}则可以覆盖getOrder()方法以及afterCommit(),因为TransactionSynchronizationAdapter已经实现了Ordered interface。来自 javadoc:

The default * {@link #getOrder() order} is 
{@link Ordered#LOWEST_PRECEDENCE}, indicating * late execution; return a lower 
value for earlier execution.

最低优先级值为Integer.MAX_VALUE

最新更新