Java 如何使用JPA和Hibernate设置读取未提交隔离级别?

Java 如何使用JPA和Hibernate设置读取未提交隔离级别?,java,hibernate,jpa,isolation-level,read-uncommitted,Java,Hibernate,Jpa,Isolation Level,Read Uncommitted,在著名的《Java持久化与Hibernate》一书中,我们可以阅读以下内容: “持久性上下文是持久性实体实例的缓存。。。。自动脏检查是这种缓存的好处之一。另一个好处是实体的可重复读取以及工作单元范围缓存的性能优势。。。启用持久性上下文缓存无需执行任何特殊操作它始终处于打开状态,并且由于所示原因,无法关闭 这是否意味着使用Hibernate永远无法实现事务隔离级别“读取未提交”?事实上,Hibernate确实提供了通过其一级缓存(持久性上下文)的重复读取,如书中所述 详情如下: 一些ORM框架(

在著名的《Java持久化与Hibernate》一书中,我们可以阅读以下内容:

“持久性上下文是持久性实体实例的缓存。。。。自动脏检查是这种缓存的好处之一。另一个好处是实体的可重复读取以及工作单元范围缓存的性能优势。。。启用持久性上下文缓存无需执行任何特殊操作它始终处于打开状态,并且由于所示原因,无法关闭


这是否意味着使用Hibernate永远无法实现事务隔离级别“读取未提交”?

事实上,Hibernate确实提供了通过其一级缓存(持久性上下文)的重复读取,如书中所述

详情如下:

一些ORM框架(例如JPA/Hibernate)提供应用程序级可重复读取。任何检索到的实体的第一个快照都缓存在当前运行的持久性上下文中。任何返回相同数据库行的连续查询都将使用以前缓存的同一对象。这样,即使在读取提交隔离级别中,也可以防止模糊读取

然而,根据上面的同一本书,似乎将Spring与JPA/hibernate结合使用可以定制事务隔离级别

在上面的书中,我们还可以阅读以下内容:

Spring在使用JpaTransactionManager时支持事务级隔离级别。对于JTA事务,JtaTransactionManager遵循JavaEE标准,不允许覆盖默认隔离级别。作为一种解决方法,Spring框架提供了扩展点,因此应用程序开发人员可以自定义默认行为并实现 基于事务设置隔离级别的机制

这是否意味着使用Hibernate永远无法实现事务隔离级别“readuncommitted”

不,没有。Hibernate为实体提供了支持。这与任何查询都不同

因此,如果您想要自定义隔离级别,例如对于给定事务执行的所有查询,而不仅仅是获取实体,那么您可以如下设置:

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void orderProduct(Long productId) {  
    ...
}     
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
现在,你的问题标题是:

(如何)使用Hibernate/JPA实现隔离级别Read Uncommitted

如果您使用的是Oracle和PostgreSQL,则无法执行此操作,因为不支持
Read Uncommitted
,您将获得
Read\u COMMITTED

对于SQL Server和MySQL,设置如下:

@Transactional(isolation = Isolation.REPEATABLE_READ)
public void orderProduct(Long productId) {  
    ...
}     
@Transactional(isolation = Isolation.READ_UNCOMMITTED)

@弗拉德·米哈尔恰你的意见是什么?