由于您正在使用 ,我们可以安全地假设您正在通过Spring,Hibernate或其他JDBC包装器执行数据库操作。这些 JDBC 包装器通常不会引发已检查的异常,它们会引发包装 JDBC 类型的运行时异常。@TransactionalSQLException
@Transactional设置为仅在需要时引发未选中的异常时才回滚。
考虑这样的用例
@Transactional
public void persistAndWrite(Bean someBean) throws IOException {
    // DB operation
    getSession().save(someBean); 
    // File IO operation which throws IOException
    someFileService.writeToFile(someBean); 
}
您不一定仅仅因为我们无法向文件写入某些内容而回滚数据库操作。
同样地
@Transactional
public void persistAndThrowOutOfMemory(Bean someBean)  {
    // DB operation
    getSession().save(someBean);
    // consumes all memory, throws OutOfMemoryError
    someService.hugeOperationThrowsOutOfMemoryError(); 
}
您不一定希望回滚保存的实体,因为某些服务导致消耗了太多内存。
@Transactional为您提供选项。在适当的情况下使用它。