Spring @transactional在未检查的异常期间不会自动回滚

时间:2018-07-16 12:54:59

标签: java spring hibernate transactional

A级{

@transactional public Void methodA(){

methodB();

int i = 10/0;

}

@transactional 公共无效方法B(){

session.save(学生)

}

方法A中有一个例外,但它没有回滚并插入学生数据。为什么?

}

4 个答案:

答案 0 :(得分:0)

默认情况下, @Transactional 会回滚运行时异常。

您需要使用 rollbackFor ()。

@Transactional(rollbackFor = {MyException.class})

答案 1 :(得分:0)

标记为@Transactional的方法必须为public

这在Spring Manual chapter 10.5.6中有记录:

  

方法可见性和@Transactional

     

使用代理时,您应申请   仅@Transactional批注   具有公众知名度的方法。如果   您可以注释受保护的,私有的或   包可见的方法   @Transactional注解,没有错误   引发,但带注释的方法   不显示已配置   交易设置。考虑一下   如果需要,可以使用AspectJ(请参见下文)   注释非公开方法。

答案 2 :(得分:0)

因为A和B分别进行交易!

当您在事务块中调用不带@Transactional的方法时,父事务将继续使用新方法。它将使用与父方法(带有@Transactional)相同的连接,并且在调用的方法中引起的任何异常(没有@Transactional都会导致事务按照事务定义中的配置回滚。

如果在同一实例中从带有@Transactional的方法中调用带有@Transactional批注的方法,则被调用方法的事务行为将不会对事务产生任何影响。但是,如果从具有事务定义的另一个方法中调用具有事务定义的方法,并且它们处于不同的实例中,则被调用方法中的代码将遵循被调用方法中给出的事务定义。

您可以在spring transaction documentation的声明式事务管理部分中找到更多详细信息。

Spring声明式事务模型使用AOP代理。因此,AOP代理负责创建交易。仅当从实例外部调用实例中包含的方法时,AOP代理才会处于活动状态。

答案 3 :(得分:0)

答案取决于您已经知道的内容。

您知道添加@Transactional批注时Spring的工作原理吗? 回答:它是通过为具有注释方法的类创建一个代理类来实现的。

您知道当代理类中的一个方法调用同一代理类中的另一个方法时,Spring Proxy对象如何工作吗? 回答:Sprig无法隐式处理这种情况。被调用方法上的任何注释都将被忽略(因为调用发生在“ this”而不是代理上) 您需要切换到AspectJ来处理这种情况的

如果您真的想了解这种行为,建议阅读Spring文档的这一部分。