首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Hibernate回滚到保存点嵌套事务

如何使用Hibernate回滚到保存点嵌套事务
EN

Stack Overflow用户
提问于 2013-11-25 16:58:30
回答 3查看 13.5K关注 0票数 11

我有一个使用Hibernate连接到数据库的JavaEE应用程序。在我的应用程序的某些部分中,我调用了具有@Transactional注释的方法。在某些情况下,我希望回滚整个事务(外部服务-方法调用和内部事务)。在某些情况下,我只想回滚内部服务方法调用(即回滚到在内部方法开始时定义的保存点)。

第一部分已经到位,但我对第二部分有一个问题。当我执行以下操作时,将得到一个"UnexpectedRollbackException“,其中包含”事务回滚“消息,因为它已被标记为只回滚。

代码语言:javascript
复制
@Service
public class OuterService{

    @AutoWired
    private InnerServcie innerService; 

    @Transactional
    public void outer(){
        try{
            innerService.inner();
        }catch(RuntimeException e){
            //if i dont throw this up, it will give me the "UnexpectedRollbackException"
            System.out.println("I cought a RuntimeException");
        }
    }
}

@Service
public class InnerServcie{
    @Transactional
    public void inner(){
        //here we insert some data into db using hibernate
        //but something goes wrong and an exception is thrown
    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-02-11 13:00:16

您要寻找的特性称为savepoints。严格地说,它们不是嵌套事务,而是后续SQL指令链中的里程碑,可以回滚到其中。回滚到保存点意味着使创建保存点时发出的所有指令无效,这样您就可以有多个保存点,但是您只能在now savepoint 之间回滚指令,而不能在两个保存点之间回滚指令!

Spring在手动使用JdbcTransactionObjectSupport时和使用@Transactional注释时都支持保存点。

根据文档http://docs.spring.io/spring/docs/2.5.3/reference/transaction.html point 9.5.7.3,您应该使用Propagation.NESTED

但是,在您的情况下可能无法使用该选项。来自Javadoc:

注意:实际创建嵌套事务只适用于特定的事务管理器。这仅适用于在JDBC3.0驱动程序上工作时的JDBC DataSourceTransactionManager。一些JTA提供程序也可能支持嵌套事务。

最后,您可以直接向savepoint发出启动/回滚SQL指令。

对于PostgreSQL来说,它应该是:

代码语言:javascript
复制
SAVEPOINT foo;

ROLLBACK TO SAVEPOINT foo;

来源:http://www.postgresql.org/docs/8.2/static/sql-rollback-to.html

票数 7
EN

Stack Overflow用户

发布于 2013-11-25 17:27:17

Spring/Hibernate/Java中不支持嵌套事务。所以,要么整个事务是回滚的,要么内部事务实际上是一个新的、不同的事务,一旦成功就会提交,即使外部事务稍后回滚。

如果后者是您想要的,那么只需用

代码语言:javascript
复制
@Transactional(propagation = Propagation.REQUIRES_NEW)
票数 0
EN

Stack Overflow用户

发布于 2014-02-11 09:16:28

尝试将globalRollbackOnParticipationFailure属性的TransactionManager设置为false

有关详细信息,请参阅http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/org/springframework/transaction/support/AbstractPlatformTransactionManager.html#setGlobalRollbackOnParticipationFailure(boolean)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20198784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档