我希望能够清楚地了解@Transactional spring注释。 假设我已经编写了我的代码, 情况下-1
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public void method1(){
.....method body....
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public String method2(){
try{
method1()
}
catch(Exce...){
}
}
案例2:
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public void method1(){
try{
}
catch(Excep..){
}
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public String method2(){
method1()
}
如果在执行method1时发生某些异常,在case-1中会发生什么,它是否回滚事务? 在案例-2中会发生什么。 Thanx提前
答案 0 :(得分:2)
只要您在method2
中捕获异常,无论异常类型或传播如何,您的任何用例都不会回滚。
为什么?
Spring为Transactional
类或成员创建一个代理类,这对您来说是不可见的。这个代理使得Spring可以在你的函数之前和之后执行代码,基本上是打开事务,提交或回滚。当您自动加载它们时,会将此代理注入您的类中。
当然Transactional
注释仅在您通过代理呼叫时才有效!
您的method1
调用始终是本地函数调用,因此只要您在method2
中捕获异常,就不会导致任何回滚。
但请阅读documentation。
答案 1 :(得分:0)
您可以自由指定。例如,使用注释可以像这样写:
@Transactional(rollbackFor=Exception.class, timeout=10)
在事务分界线上抛出异常时,不会回滚默认行为。
答案 2 :(得分:0)
Spring @Transactional
默认配置(在此处使用)仅针对java.lang.RuntimeException
进行回滚,传播为REQUIRED
。
所以如果你正在调用method2():
java.lang.Exception
(java.lang.RuntimeException
的父级)java.lang.Exception
此处传播的含义是,当您遇到@Transaction的另一个注释时,如果您启动了一个事务,则不启动另一个事务,并且应用程序使用"外部"交易。所以不要指望在method2()完成之前执行回滚逻辑。无论如何,你可以从你的代码片段假设这些方法在同一个Spring Bean中,因此在bean内部调用一个方法(method2()在这里调用method1())AOP注释不是" active"这意味着f / w甚至不会"看到"方法1()上的@Transactionl。
修改
问题已更改,因此回滚适用于所有java.lang.Throwable
。所以答案是相同的,除非抛出java.lang.Error
,然后在method2()完成后两种情况下都会回滚。