@Transactional rollbackFor范围

问题描述

我在代码中使用@Transactional,并且创建了一个自定义异常,以在UI中以特定格式显示错误消息。

public class MyCustomException extends RuntimeException

遇到此异常时,我仍然想回滚我的事务,就像发生任何其他异常一样。

为使其正常工作,我在下面编写代码

// service method called from rest controller
public List<String> getMyData() { 
    
    List<String> errors = new ArrayList();
    try {
        businessMethod();
    } catch (MyCustomException e) {
        log.error(e.getMessage);
        errors.add(e.getMessage)
    }
return errors.
}

@Transactional(rollbackFor = {MyCustomException.class,RuntimeException.class,Exception.class})
public String businessMethod() {
    // Business logic to get data that can throw MyCustomException
}

我的问题是:

  1. 如果我在MyCustomException.class中提到rollbackFor,是否还需要提及RuntimeException.class,Exception.class。否则,rollbackFor中提到的任何内容都会与认的异常一起添加到该异常中,并为其回滚事务。

  2. 尽管我从MyCustomException中转义了businessMethod(),但是在其调用方法getMyData()上却抓住了它。我假设在发生异常的情况下事务将被回滚,对吗?

解决方法

  1. 该交易将在任何RuntimeException上回滚,因此MyException.class段中不需要声明您自己的rollbackFor,因为您的MyException可以扩展RuntimeException。如果声明Exception.class,则将在发生任何异常时执行回滚。但就您而言,您根本不需要rollbackFor

  2. 是的,这是正确的。您的交易以businessMethod()开始和结束。