gpt4 book ai didi

hibernate - 仅当子方法中发生异常时,才仅对事务进行回滚

转载 作者:行者123 更新时间:2023-12-04 13:20:59 25 4
gpt4 key购买 nike

我正在使用Hibernate + spring + @Transactional批注来处理应用程序中的事务。

事务管理器声明如下:

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

<tx:annotation-driven transaction-manager="transactionManager"/>

在大多数情况下,此方法效果很好,但是我发现有两个方法都带有@Transactional注释的问题:
package temp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

public class OuterTestService {
@Autowired
private InnerTestService innerTestService;

@Transactional
public void outerMethod() {
try {
innerTestService.innerTestMethod();
} catch (RuntimeException e) {
// some code here
}
}
}


package temp;

import org.springframework.transaction.annotation.Transactional;

public class InnerTestService {

@Transactional
public void innerTestMethod() throws RuntimeException {
throw new RuntimeException();
}
}

当我调用OuterTestService#outerMethod()时,出现异常
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

因为只有一个事务(没有嵌套事务),所以整个 outerTestMethod()的事务都标记为仅回滚。

我发现可以使用noRollbackFor轻松克服此问题:
package cz.csas.pdb.be.service.tempdelete;

import org.springframework.transaction.annotation.Transactional;

public class InnerTestService {

@Transactional(noRollbackFor = RuntimeException.class)
public void innerTestMethod() throws RuntimeException {
throw new RuntimeException();
}
}

但这必须在每种方法上明确使用。因为在测试(回滚)过程中不会引发此错误,所以这是 Not Acceptable 。

我的问题-是否有一种方法可以自动(例如,不是为每个方法都明确地)设置事务仅在启动事务的方法(在这种情况下为 outerTestMethod())引发异常时才回滚?

最佳答案

创建另一个注释,例如@NoRollbackTransactional,类似于:

@Transactional(noRollbackFor = RuntimeException.class)
public @interface NoRollbackTransactional {
}

并在您的方法上使用它。另一方面,我同意Donal的评论,您应该修改交易范围,恕我直言,从另一个 @Transactional调用 @Transactional通常不是一个好主意。

关于hibernate - 仅当子方法中发生异常时,才仅对事务进行回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6097012/

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