Кажется, что транзакция не работает в режиме Spring. - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь реализовать декларативное управление транзакциями в настройках 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 Ответ

1 голос
/ 26 августа 2011

Spring откатывает транзакции по исключению, только если пользовательское исключение расширяется RuntimeException.Убедитесь, что FooException extends RuntimeException ( reference ):

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

На основании вашего комментария необходимо проверить еще 2 вещи: 1) убедитесь, что у вас есть транзакция платформыменеджер настроен.Пример:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean>

Кроме того, если вы хотите использовать аннотации для транзакций, вам также необходимо настроить это:

<tx:annotation-driven />
...