2011-08-26 87 views
1

我试图在Spring + Struts + Hibernate设置中实现声明式事务管理。 这是我的applicationContext.xml的一部分在Spring声明式事务模式下,事务似乎不起作用

<property> 
    <props> 
    <prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop> 
    </props> 
</property> 

我已经定义在我FooService接口类两个公共方法 - > UpdateFoo,foodooTest 和两个私有方法(其具有更新逻辑) - >测试1和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

你应该发布更多相关SUFF:Spring配置以及触发交易的方法。 – Ralph

回答

1

只有在自定义异常扩展为RuntimeException的情况下,Spring才会回滚异常事务。确保FooException延伸RuntimeExceptionreference):

在其默认的配置,Spring框架的事务基础架构代码只标志着运行的情况下,事务回滚,未检查异常;也就是说,抛出的异常是RuntimeException的一个实例或子类时。 (错误也会 - 默认情况下 - 导致回滚)。从事务性方法引发的检查异常不会导致默认配置中的回滚。

根据你的评论,这里有2个更多的事情要检查:1)确保你有一个平台事务管理器配置。例如:

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

此外,如果你想使用注释进行交易,你需​​要配置它:

<tx:annotation-driven /> 
+0

好吧,我的问题不是真的回滚(我认为这是控制)。我的问题是在Test1和Test2(我可以在DB中看到)中发生提交,甚至在我继续之前抛出FooException。 –

+0

是的,它被配置。另外,如果我将'UpdateFoo'添加到应用程序配置中,则事务按预期工作。 (在这两种情况下,我正在从struts动作中调用UpdateFoo。 –

+0

这意味着您用于测试的Spring配置与您的应用的Spring配置不匹配。请尽可能使两者匹配。 – atrain

相关问题