Spring中遇到异常时的事务回滚

3

我正在学习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事务。
非常感谢
2个回答

2
如果任何一个方法抛出了Exception,事务将会回滚。但是现在没有任何一个方法抛出Exception。在catch块中重新抛出Exception即可解决问题。请查看Transactional注释的文档。

1
谢谢。但是当我捕获到任何异常时,事务仍然会回滚吗?我不明白@.@。 - Tea
你是如何检查事务是否已回滚的?可能是因为事务未提交。请检查您的配置。 - Adisesha
我认为,虽然createMember()方法在保存到数据库时出现了问题(这里我使用的是函数'saveAndFlush()'),但我知道并捕获了该异常。父事务createGroupStudent()认为自己没有问题并提交了事务。但是当再次提交时,createMember()方法将中断并抛出异常。我认为createGroup()方法不会回滚。但实际上,该函数已经回滚,所有事务都已回滚?发生了什么?这是我的问题:(。我正在使用Atomikos事务。 - Tea
你遇到了什么异常?你能把“Propagation”设置为“Required”并尝试一下吗?https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#propagation-- - Adisesha

1
如果您正在使用Hibernate,请考虑以下情况。当执行repoMember.save(A,B)时,Hibernate会话尚未刷新会话(即执行保存SQL),直到createMember()完成。 当Hibernate实际刷新并执行保存SQL时,就会出现错误。这就是为什么您可能无法捕获导致事务回滚的异常的原因。这是一个可能有帮助的链接:http://hedleyproctor.com/2014/08/understanding-hibernate-session-flushing/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接