Кажется, что транзакция не работает в режиме Spring.
Я пытаюсь реализовать декларативное управление транзакциями в настройках Spring+Struts+Hibernate. Это часть моего applicationcontext.xml
<property>
<props>
<prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop>
</props>
</property>
Я определил два открытых метода в моем классе FooService -> UpdateFoo, foodooTest и два частных метода (которые имеют логику обновления) -> Test1 и Test2
Звонок идет как:
UpdateFoo->foodooTest->Test1
->Test2
(foodooTest должен инициировать транзакцию) Я создаю компонент
FooService fooService = (FooService)context.getBean("fooService");
//and call
fooService.UpdateFoo();
Test2 выдает FooException и, следовательно, я ожидаю, что транзакция будет откатываться. Но это не так. Фиксация происходит в каждом Test1 и Test2 (до исключения). Я использую Hibernate getHibernateTemplate.Merge() для обновлений. Мой двигатель БД - InnoDB.
Я не уверен, что мне здесь не хватает.
1 ответ
Spring откатывает транзакции по исключению, только если пользовательское исключение расширяется RuntimeException
, Удостовериться FooException
продолжается RuntimeException
( ссылка):
В конфигурации по умолчанию код инфраструктуры транзакций Spring Framework помечает транзакцию для отката только в случае выполнения, непроверенных исключений; то есть, когда выброшенное исключение является экземпляром или подклассом RuntimeException. (Ошибки также по умолчанию приводят к откату). Проверенные исключения, которые вызываются из транзакционного метода, не приводят к откату в конфигурации по умолчанию.
Исходя из вашего комментария, необходимо проверить еще 2 вещи: 1) убедитесь, что у вас настроен менеджер транзакций платформы. Пример:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>
Кроме того, если вы хотите использовать аннотации для транзакций, вам также необходимо настроить это:
<tx:annotation-driven />