我正在尝试在Spring + Struts + Hibernate设置中实现声明式事务管理。 这是我的applicationcontext.xml
的一部分<property>
<props>
<prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop>
</props>
</property>
我在我的FooService类中定义了两个公共方法 - &gt; UpdateFoo,foodooTest 和两个私有方法(具有更新逻辑) - &gt; 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。
我不确定我在这里失踪了什么。
答案 0 :(得分:1)
只有在自定义异常扩展RuntimeException
时,Spring才会回滚异常上的事务。确保FooException
延伸RuntimeException
(reference):
在默认配置中,Spring Framework的事务基础结构代码仅在运行时未经检查的异常情况下标记用于回滚的事务;也就是说,抛出的异常是RuntimeException的实例或子类。 (错误也将 - 默认情况下 - 导致回滚)。从事务方法抛出的已检查异常不会导致在默认配置中回滚。
根据您的评论,还有两件事要检查:1)确保您配置了平台事务管理器。例如:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>
此外,如果要对事务使用注释,还需要对其进行配置:
<tx:annotation-driven />