首页 > 解决方案 > 我们如何使用 JPA 和 Hibernate 设置 Read Uncommitted 隔离级别?

问题描述

在他的名著《Java persistence with Hibernate》中,我们可以读到以下内容:

“持久性上下文是持久性实体实例的缓存......自动脏检查是这种缓存的好处之一。另一个好处是实体的可重复读取和工作范围缓存单元的性能优势......你不需要做任何特别的事情来启用持久性上下文缓存。它总是打开的,并且由于所示的原因,不能被关闭

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

标签: javahibernatejpaisolation-levelread-uncommitted

解决方案


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

不,它没有。Hibernateapplication-level repeatable reads为实体提供。这与DB-level repeatable reads适用于任何查询的不同。

所以,如果你想要一个自定义的隔离级别,比如REPEATABLE_READ给定事务执行的所有查询,而不仅仅是获取实体,那么你可以像这样设置它:

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

现在,您的问题标题说:

(如何)我们可以使用 Hibernate/JPA 实现 Read Uncommitted 隔离级别吗?

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

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

@Transactional(isolation = Isolation.READ_UNCOMMITTED)

推荐阅读