1

我正在尝试在 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 应该触发事务)我创建了 bean

FooService fooService = (FooService)context.getBean("fooService");
//and call
fooService.UpdateFoo();

Test2 抛出 FooException ,因此我希望事务回滚。但事实并非如此。提交发生在每个 Test1 和 Test2 中(直到异常)。我使用 Hibernate getHibernateTemplate.Merge() 进行更新。我的数据库引擎是 InnoDB。

我不确定我在这里缺少什么。

4

1 回答 1

1

仅当自定义异常扩展时,Spring 才会回滚异常事务RuntimeException。确保FooException扩展RuntimeException参考):

在其默认配置中,Spring Framework 的事务基础结构代码仅在运行时、未经检查的异常情况下将事务标记为回滚;也就是说,当抛出的异常是 RuntimeException 的实例或子类时。(错误也会 - 默认情况下 - 导致回滚)。从事务方法抛出的已检查异常不会导致默认配置中的回滚。

根据您的评论,还有两件事需要检查:1) 确保您配置了平台事务管理器。例子:

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

此外,如果你想对事务使用注解,你也需要配置它:

<tx:annotation-driven />
于 2011-08-26T13:09:04.937 回答