使用try catch块时的Spring @Transactional注释


问题内容

如果我们在带有@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事务不会回滚。

To rollback the exception programmatically,我们可以执行以下操作。

陈述式

@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();
  }
}

You are strongly encouraged to use the `declarative approach` to `rollback` if at all possible. 
`Programmatic rollback` is available should only be used if you absolutely need it.