【问题标题】:Transaction doesn't seem to work in Spring Declarative Transaction Mode事务似乎在 Spring 声明式事务模式下不起作用
【发布时间】:2011-11-04 10:37:54
【问题描述】:

我正在尝试在 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。

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

【问题讨论】:

  • 你应该发布更多相关的suff:spring配置和触发事务的方法。

标签: java hibernate spring transactions declarative


【解决方案1】:

仅当自定义异常扩展 RuntimeException 时,Spring 才会回滚异常事务。确保FooException 扩展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 />

【讨论】:

  • 好的,我的问题并不是真正的回滚(我认为这是可控的)。我的问题是提交发生在 Test1 和 Test2(我可以在 DB 中看到)甚至在我继续抛出 FooException 之前。
  • 是的,已配置。此外,如果我将“UpdateFoo”添加到应用程序配置中,事务将按预期工作。 (在这两种情况下,我都从 struts 操作调用 UpdateFoo。
  • 这意味着您用于测试的 Spring 配置与您的应用程序的 Spring 配置不匹配。让这两者尽可能匹配。
  • 您能详细说明一下吗?我正在我的本地盒子上工作,并对其进行更新和测试。我的担心 -> 如果我将 Service_Call 方法(我从 Struts 操作类调用)添加到定义事务规则的配置中,事务似乎按预期工作。但是,如果我没有将 Service_Call 添加到该配置,而是将代理方法 Foo 添加到 Config 并从 Service_Call 方法调用 Foo,则事务似乎不起作用。
  • 我的意思是:如果您在 Spring 应用程序的配置之外运行测试(例如,使用 SpringJUnit4ClassRunner),那么这可能会导致不同的行为。如果您要更改在应用程序中调用该方法的方式,那就不同了。请更新您的问题以反映您尝试调试的完整配置。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多