Когда сделка будет совершена? - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужно немного разъяснений относительно весеннего перехода. В ClassA я создаю декларативную транзакцию. С ClassA я звоню method1() из ClassB. ClassB имеет аннотацию @Transactional(propagation = Propagation.REQUIRED) на уровне класса. В method1() я делаю операцию сохранения.

У меня вопрос, когда эти данные будут зафиксированы? Будет ли оно совершено, пока из-под контроля method1()? или в ClassA, где мы совершаем транзакцию вручную?

Код:

ClassA

class ClassA {

    void myMethod() {
        TransactionStatus status = null;
        DefaultTransactionDefinition def =
                new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        def.setTimeout(contentFileProcessingConfigBean.getFileCopyTransactionTimeout());
        status = transactionManager.getTransaction(def);

        b.method1();

        if (status != null) {
            transactionManager.commit(status);
        }
    }

}

ClassB

@Transactional(propagation = Propagation.REQUIRED)
class ClassB {

void method1() {

//doing save operation

}
}

1 Ответ

0 голосов
/ 14 ноября 2018

Вероятно, после того, как B.method1() завершит аспект, заключающий в себе вызов @Transactional (видимый в трассировке стека), совершит транзакцию.Однако это будет зависеть от:

  • Являются ли A и B обоими компонентами Spring?
  • Является ли один и тот же компонент transactionManager используемым транзакциями в A и B?
  • Возможно, если A написано с использованием TransactionTemplate вместо простого TransactionManager объекта.

Смешивание ручного и декларативного управления транзакциямине рекомендуется, как вы должны догадаться.Я думаю, это придет к transactionManager, который вы не показываете.

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