问题描述
|
我正在使用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
因为只有一个事务(没有嵌套事务),所以整个ѭ5的事务都标记为仅回滚。
我发现可以使用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();
}
}
但这必须在每种方法上明确使用。因为在测试(回滚)过程中不会引发此错误,所以这是不可接受的。
我的问题-是否有一种方法可以自动(例如,不是为每个方法都明确地)设置事务仅在启动事务的方法(在本例中为“ 5”)中引发异常时才回滚?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)