Транзакция не откатывается, хотя выдается исключение - PullRequest
0 голосов
/ 28 сентября 2018

В настоящее время мы сталкиваемся с проблемой, связанной с весенними транзакциями в нашем приложении.Как видите, в deleteRecord() мы делаем операцию с БД.Но в следующей строке выдается бизнес-исключение.

Ожидаемое поведение (насколько мне известно): Операция БД должна быть откатана, так как исключение выдается из следующей строки

Фактическое поведение: Это не откат назад.Данные вставляются в таблицу

Вопрос: Почему транзакция не откатывается?Я не думаю, что это из-за блока catch, потому что deleteRecord() будет выполняться в новой транзакции.Пожалуйста, поправьте меня, если я ошибаюсь

Код:

class A {
    void myMethod() {
        for(int i=0 ; i<count ; i++) {
            try {
                    deleteRecord();
                } catch(Exception e) {
                    log.error("Exception caught");

                }

        }

}

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    deleteRecord() throws Exception{
        line 1 : deleting record 
        line 2 : Throwing business exception 

    }
}

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

В документации Spring говорится следующее:

Хотя поведение EJB по умолчанию заключается в том, что контейнер EJB автоматически откатывает транзакцию по системному исключению (обычно исключение времени выполнения), EJB CMT не выполняетавтоматически откат транзакции для исключения приложения (то есть проверенного исключения, отличного от java.rmi.RemoteException).Хотя поведение Spring по умолчанию для декларативного управления транзакциями соответствует соглашению EJB (откат выполняется автоматически только при непроверенных исключениях), часто бывает полезно настроить это.

И

В конфигурации по умолчанию код инфраструктуры транзакций Spring Framework помечает транзакцию для отката только в случае выполнения, непроверенных исключений;то есть, когда выброшенное исключение является экземпляром или подклассом RuntimeException.(Ошибки также по умолчанию приводят к откату).Проверенные исключения, которые вызываются из транзакционного метода, не приводят к откату в конфигурации по умолчанию

, см. В 16.5.3: https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html

Это говорит о том, что поведение по умолчаниютранзакция будет отменена только на RuntimeException с.Если у вас есть собственное бизнес-исключение (это может быть проверенное исключение), вы должны явно назвать класс исключения, для которого транзакция должна откатиться:

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = YOUREXCEPTION.class)
0 голосов
/ 28 сентября 2018

Это из-за вызова метода @Transaction методом в том же классе, не работает, если вы не настроили Spring для использования AspectJ.

Вызов метода Spring @Transaction методом внутритот же класс, не работает?

0 голосов
/ 28 сентября 2018

изменить на

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...