У меня есть некоторые логи c, которые должны быть выполнены после фиксации транзакции, поэтому я использую что-то вроде ниже:
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
Но гарантировано ли это? Если нет, то как мне применить порядок, чтобы внутренний всегда выполнялся первым?