Spring @Transaction не выполняет откат при появлении исключения
Вопрос
Я искал этот вопрос, их довольно много здесь, в 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?