Java / Spring: как указать порядок для вложенных транзакций с TransactionSynchronizationManager - PullRequest
1 голос
/ 27 января 2020

У меня есть некоторые логи 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

Но гарантировано ли это? Если нет, то как мне применить порядок, чтобы внутренний всегда выполнялся первым?

1 Ответ

1 голос
/ 29 января 2020

javado c метода registerSynchronization () говорит:

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)

Если вы используете новый TransactionSynchronizationAdapter() {..} вместо new TransactionSynchronization() {..}, вы можете переопределить метод getOrder() вместе с afterCommit() поскольку TransactionSynchronizationAdapter уже реализует Ordered interface. От javado c:

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

Самое низкое значение приоритета Integer.MAX_VALUE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...