Spring中的异常时的事务回滚

时间:2016-04-21 04:20:44

标签: java spring transactions commit rollback

我正在学习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 in each methods但它没有工作。

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

我正在使用atomikos交易。

非常感谢

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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