如何使用jpa和hibernate设置readuncommitted隔离级别?

yiytaume  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(482)

在著名的《java持久化与hibernate》一书中,我们可以看到以下内容:
“持久性上下文是持久性实体示例的缓存。。。。自动脏检查是这种缓存的好处之一。另一个好处是实体的可重复读取和工作单元范围缓存的性能优势。。。您不必做任何特殊的事情来启用持久性上下文缓存。它总是开着,而且,出于所显示的原因,不能关闭。
这是否意味着永远不能用hibernate实现事务隔离级别“readuncommitted”?

xu3bshqb

xu3bshqb1#

这是否意味着永远不能用hibernate实现事务隔离级别“readuncommitted”?
不,没有。hibernate为实体提供应用程序级的可重复读取。这与适用于任何查询的db级可重复读取不同。
所以,如果你想要一个自定义的隔离级别,比如 REPEATABLE_READ 对于给定事务执行的所有查询,而不仅仅是获取实体,您可以这样设置:

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

有关使用java数据访问框架时隔离级别的更多详细信息,请参阅本文。
现在,你的题目是:
(如何)使用hibernate/jpa实现隔离级别read uncommitted?
如果您使用的是oracle和postgresql,那么您不能这样做,因为 Read Uncommitted 不支持,您将获得读\u提交的isntead。
对于sql server和mysql,设置如下:

@Transactional(isolation = Isolation.READ_UNCOMMITTED)
xpcnnkqh

xpcnnkqh2#

实际上,hibernate确实提供了一级缓存(持久性上下文)中的repeateble读取
vladmihalcea的“事务和并发控制”。
具体如下:
一些orm框架(例如jpa/hibernate)提供应用程序级的可重复读取。任何检索到的实体的第一个快照都缓存在当前运行的持久性上下文中。任何返回相同数据库行的连续查询都将使用先前缓存的同一对象。这样,即使在读取提交隔离级别中,也可以防止模糊读取。
然而,根据上面的同一本书,使用spring和jpa/hibernate似乎可以定制事务隔离级别。
在上面的书中,我们还可以看到以下内容:
spring在使用jpatransactionmanager时支持事务级隔离级别。对于jta事务,jtatransactionmanager遵循JavaEE标准,不允许重写默认隔离级别。作为一种解决方法,spring框架提供了扩展点,因此应用程序开发人员可以自定义默认行为,并实现一种机制来在事务的基础上设置隔离级别。

相关问题