【问题标题】:Transaction rollback when exception in SpringSpring异常时事务回滚
【发布时间】:2016-08-14 01:32:43
【问题描述】:

我正在学习 Spring,但在 Spring 中的事务处理有些问题。

这是我的代码

@Transactional(rollbackFor = Exception.class)
public void createGroupStudent(Student A,Student B,String nameGroup){
    try{
        //create Group
        createGroup(nameGroup);
        //createMember
        createMember(A,B);
    }catch(Exception e){
        logger.error(e.getMessage());
    }
}

@Transactional(rollbackFor = Exception.class)
public void createGroup(String nameGroup){
    try{
        repoGroup.save(nameGroup);
    }catch(Exception e){
        logger.error(e.getMessage());
    }
}

@Transactional(rollbackFor = Exception.class)
public void createMember(Student A,Student B){
    try{
        // function will throw a kind of Exception involve to " error constraint sql oracle " . 
        //It's my intended
        repoMember.save(A,B);
    }catch(Exception e){
        logger.error(e.getMessage());
    }
}

问题是当函数createMember()抛出异常时,事务总是回滚,为什么?我无法理解发生了什么!我在每种方法中都添加了 try, catch ,但它不起作用。

虽然方法createMember() 在保存到数据库时遇到了问题(这里我使用的是函数saveAndFlush())。我知道并且我发现了这个异常。父事务createGroupStudent() 认为自己没有问题并提交事务。但是当再次提交时,方法createMember() 将中断并抛出异常。我认为方法createGroup() 不会回滚。但实际上,该功能回滚,所有事务都回滚?发生了什么?

我正在使用 atomikos 交易。

非常感谢

【问题讨论】:

    标签: java spring transactions commit rollback


    【解决方案1】:

    如果任何方法抛出Exception,事务将回滚。但是没有一个方法抛出Exception。在 catch 块中重新抛出 Exception,它将起作用。检查文档中的 Transactional 注释。

    【讨论】:

    • 谢谢。但是当我发现任何异常时。事务仍然回滚?我不明白@.@。
    • 如何检查事务是否回滚?可能是事务未提交。检查您的配置。
    • 我认为,虽然 createMember() 方法在保存到数据库时有问题(这里我使用的是函数“saveAndFlush()”)。我知道,我抓住了那个例外。现有事务 createGroupStudent() 认为自己没有问题并提交事务。但是当再次提交时,方法 createMember() 将中断并抛出 Exception 。我认为方法 createGroup() 不会回滚。但实际上,那个功能是回滚的,所有的事务都是回滚的?发生了什么 ???? .这是我的问题:(。我正在使用 atomikos 交易
    • 您遇到的异常是什么?您可以将“传播”设置为“必需”,然后尝试吗? docs.spring.io/spring/docs/current/javadoc-api/org/…
    【解决方案2】:

    如果您使用的是休眠,请考虑这种情况。

    当 repoMember.save(A,B);执行时,休眠会话尚未刷新会话(即执行保存 sql) util createMember() 已完成。当休眠实际刷新并执行保存 sql 时,会发生该错误。这就是为什么您可能无法捕获导致事务回滚的异常的原因。

    这里是可能有用的链接 http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2013-10-16
      • 1970-01-01
      • 2022-07-22
      • 2012-11-05
      • 2012-02-14
      相关资源
      最近更新 更多