gpt4 book ai didi

java - 无法使用 Spring JPA READ UNCOMMITTED 隔离级别读取未提交的数据

转载 作者:行者123 更新时间:2023-12-01 18:50:19 25 4
gpt4 key购买 nike

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

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

触发 JPA 存储库方法的 Controller 端点:

@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() 中,我正在更新 person 对象,刷新记录,我相信一旦方法调用完成,transaction 将被提交,即记录将保持未提交状态,因为Thread.sleep

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

最佳答案

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

PostgreSQL 通过接受 READ UNCOMMITTED 来利用这一点,但实际上为您提供 READ COMMITTED

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

关于java - 无法使用 Spring JPA READ UNCOMMITTED 隔离级别读取未提交的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59747276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com