如果我们在带有@Transactional
注解的方法中捕获到异常,如果发生异常会回滚吗?
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Throwable.class)
public void yearEndProcess() {
try {
// try block
} catch (Throwable throwable) {
// catch block
}
}
最佳答案
例如
class A{
@Transactional
public Result doStuff(){
Result res = null;
try {
// do stuff
} catch (Exception e) {
}
return res ;
}
}
如果 doStuff
方法中有异常,则 事务不会回滚。
要以编程方式回滚异常
,我们可以执行如下操作。
声明式方法
@Transactional(rollbackFor={MyException1.class, MyException2.class, ....})
public Result doStuff(){
...
}
程序化回滚
您需要从 TransactionAspectSupport
调用它。
public Result doStuff(){
try {
// business logic...
} catch (Exception ex) {
// trigger rollback programmatically
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
如果可能的话,强烈建议您使用 declarative 方法
来 rollback
。
Programmatic rollback
是可用的,只有在绝对需要时才应该使用它。
关于使用 try catch block 时的 Spring @Transactional 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738883/