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
属性指定了BookNotFoundException
和SQLException
。因此,如果addBook
方法在执行过程中抛出了这两种异常中的任意一种,那么Spring就会将当前的事务标记为回滚。
需要注意的是,Spring默认只对运行时异常(RuntimeException
的子类)和错误(Error
的子类)进行回滚,对于检查型异常(即,非RuntimeException
的Exception
子类)是不会回滚的。如果你希望Spring对某个检查型异常也进行回滚,那么就需要像上面的例子那样,使用rollbackFor
属性来指定这个异常。