Spring 异常时事务回滚

Transaction rollback when exception in Spring

我正在学习 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() 将中断并抛出 Exception.I 认为方法 createGroup() 不会回滚。但实际上,那个函数回滚了,所有的交易都回滚了?发生了什么事?

我正在使用 atomikos 交易。

非常感谢

如果任何方法抛出 Exception,事务将回滚。但是 none 的方法正在抛出 Exception。重新抛出 catch 块中的 Exception,它将 work.Check Transactional 注释的文档。

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

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

这里 link 可能会有帮助 http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/