【发布时间】: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