【问题标题】:Unable to read uncommited data using Spring JPA READ_UNCOMMITTED isolation level无法使用 Spring JPA 读取未提交的隔离级别读取未提交的数据
【发布时间】:2020-05-01 23:25:15
【问题描述】:

我有两种 JPA 存储库方法,一种方法更新记录并执行I/O 操作。另一种方法是从 Postgres 数据库中读取一条记录,但是这里我要允许脏读。

以下代码是实验性的,不是生产级代码。

用于触发 JPA 存储库方法的控制器端点:

@GetMapping( "update" )
public String updatePerson( ) throws InterruptedException {
    return managerService.updatePerson();
}

@GetMapping( "read_uncommitted" )
public String getUncommited( ) {
    return personService.readUncommited();
}

JPA 存储库方法:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public String updatePerson( ) throws InterruptedException {
    Person person = entityManager.find(Person.class, 55L);
    person.setName("Chuck Norris");
    entityManager.persist(person);
    entityManager.flush();
    Thread.sleep(15000); // imitating I/O behaviour
    return person.getName();
}

@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true, isolation = Isolation.READ_UNCOMMITTED )
public String readUncommited() {
    Person person = entityManager.find(Person.class, 55L);
    return person.getName();
}

updatePerson(),我正在更新人员对象,刷新记录,我相信一旦方法调用完成,transaction 将被提交,即由于Thread.sleep,记录将保持在未提交状态

现在在readUncommitted() 中,我试图在触发updatePerson() 后立即读取相同的记录。该方法用Isolation.READ_UNCOMMITTED注解,但我无法读取上面更新的未提交记录。

【问题讨论】:

  • Postgres 不支持读取未提交。它永远不会允许脏读。

标签: java spring postgresql transactions spring-transactions


【解决方案1】:

SQL 标准定义READ UNCOMMITTED,但没有为它定义任何隔离保证。换句话说,它并不要求您实际看到该隔离级别中未提交的数据。

PostgreSQL 通过接受READ UNCOMMITTED 来利用这一点,但实际上给了你READ COMMITTED

使用读锁操作的数据库通常使用READ UNCOMMITTED 来解决这个限制,但在 PostgreSQL 中很难提出用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2020-08-18
    • 2018-02-14
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多