我有一些逻辑需要在事务提交后执行,所以我使用如下的东西:
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