A级{
@transactional public Void methodA(){
methodB();
int i = 10/0;
}
@transactional 公共无效方法B(){
session.save(学生)
}
方法A中有一个例外,但它没有回滚并插入学生数据。为什么?
}
答案 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文档的这一部分。