Spring @Transaction не выполняет откат при появлении исключения

StackOverflow https://stackoverflow.com/questions/9335607

  •  27-10-2019
  •  | 
  •  

Вопрос

Я искал этот вопрос, их довольно много здесь, в StackOverflow и Google, но мне кажется, что у меня ничего не работает.

вот мои коды Конфигурация Spring: (Я не использую pointcut - думаю, мне не нужно?)

родовое слово

У меня есть класс обслуживания:

родовое слово

и класс Дао:

родовое слово

Некоторые ненужные детали удалены (например, отсутствует сеттер и т. д.). Предположим, что код работает отлично.

Моя проблема с вышеизложенным заключается в том, что когда я добавил строку случайного исключения throw, она не откатывается, объект, сохраняемый через DAO, остается в базе данных.

Я использую Spring 3.1 и Hibernate 3.6 (поскольку в Spring 3.1 была ошибка с Hibernate 4.0)

Мысли?

Спасибо

Это было полезно?

Решение 2

Я нашел причину своей проблемы и почему транзакция (по-видимому) не управляется должным образом.

Где-то в моем коде

родовое слово

В той части, где говорится «- Здесь немного логики -», была реализована некоторая логика, которая использует необработанный SQL и вызывает обновление выполнения:

родовое слово

И поскольку он не использует запрос Hibernate, а вместо этого использует необработанное выполнение SQL, он вызвал вызов сброса, и, таким образом, любая работа, выполненная до вызова, будет зафиксирована вместе с Это.

Я переработал поток логики, чтобы учесть эту логику, чтобы обеспечить правильное управление транзакцией.Хотя использование необработанного SQL может указывать на то, что что-то не так - это было необходимо сделать из-за того, что служба пытается выполнить, и для повышения производительности службы.

Другие советы

Это предполагаемое поведение управления транзакциями. По умолчанию @Transactional откатывается только для исключений времени выполнения. Если вы хотите, чтобы ваш материал откатился после выброса DaoException, добавьте его в список исключений отката.Не забудьте также включить RuntimeException. Попробуйте следующее на классе Дао @Transactional (распространение= Propagation.Mandatory, rollbackFor= {RuntimeException.class, DaoException.class})

Попробуйте удалить аннотацию @Transactional из класса DaoImpl.Я подозреваю, что может происходить то, что транзакция фиксируется, когда она пересекает границу транзакции (DaoImpl).У меня был смешанный успех с этой установкой.Вы можете попробовать несколько различных подходов к «внутренней» транзакции.

Еще вы можете включить весеннее ведение журнала транзакций.Он думает, что его категория org.springframework.transaction или что-то в этом роде.Таким образом вы точно увидите, что он делает для отката и фиксации транзакций ...

у вас нет одного из тех драйверов JDBC, которые по умолчанию находятся в режиме AUTOCOMMIT?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top