Spring 事务如何指定回滚的异常?

在Spring中,我们可以使用@Transactional注解的rollbackFor属性来指定哪些异常会导致事务回滚。rollbackFor接收一个Throwable类数组,当方法抛出指定的异常时,Spring就会将当前的事务标记为回滚。

下面是一个示例,展示了如何使用rollbackFor属性:

@Service
public class BookService {

    @Autowired
    private BookRepository bookRepository;

    @Transactional(rollbackFor = {BookNotFoundException.class, SQLException.class})
    public void addBook(Book book) throws BookNotFoundException, SQLException {
        // 如果这里抛出了BookNotFoundException或SQLException,那么事务会被回滚
        bookRepository.save(book);
    }
}

在这个例子中,addBook方法被标记为@Transactional,并且rollbackFor属性指定了BookNotFoundExceptionSQLException。因此,如果addBook方法在执行过程中抛出了这两种异常中的任意一种,那么Spring就会将当前的事务标记为回滚。

需要注意的是,Spring默认只对运行时异常(RuntimeException的子类)和错误(Error的子类)进行回滚,对于检查型异常(即,非RuntimeExceptionException子类)是不会回滚的。如果你希望Spring对某个检查型异常也进行回滚,那么就需要像上面的例子那样,使用rollbackFor属性来指定这个异常。

发表评论

后才能评论