gpt4 book ai didi

java - Spring声明式事务模式下事务似乎不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 08:32:27 25 4
gpt4 key购买 nike

我正在尝试在 Spring+Struts+Hibernate 设置中实现声明式事务管理。这是我的 applicationcontext.xml 的一部分

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

我在 FooService 类中定义了两个公共(public)方法 -> UpdateFoo、foodooTest和两个私有(private)方法(具有更新逻辑)-> 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。

我不确定我在这里错过了什么。

最佳答案

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

In its default configuration, the Spring Framework's transaction infrastructure code only marks a transaction for rollback in the case of runtime, unchecked exceptions; that is, when the thrown exception is an instance or subclass of RuntimeException. (Errors will also - by default - result in a rollback). Checked exceptions that are thrown from a transactional method do not result in rollback in the default configuration.

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

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

此外,如果你想在事务中使用注解,你也需要进行配置:

<tx:annotation-driven />

关于java - Spring声明式事务模式下事务似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7203660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com