无法使用 Spring JPA READ_UNCOMMITTED 隔离级别读取未提交的数据
Unable to read uncommited data using Spring JPA READ_UNCOMMITTED isolation level
我有两个 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
[=,记录将保持未提交状态21=]
现在 readUncommitted()
我正在尝试在触发 updatePerson()
后立即读取同一条记录。该方法用Isolation.READ_UNCOMMITTED
注释,但我无法读取上面更新未提交的记录。
SQL 标准通过不为其定义任何隔离保证来定义 READ UNCOMMITTED
。换句话说,它不需要您实际看到该隔离级别中未提交的数据。
PostgreSQL 通过接受 READ UNCOMMITTED
来利用这一点,但实际上给你 READ COMMITTED
.
使用读锁操作的数据库通常使用 READ UNCOMMITTED
来解决该限制,但很难在 PostgreSQL.
中提出用例
我有两个 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
[=,记录将保持未提交状态21=]
现在 readUncommitted()
我正在尝试在触发 updatePerson()
后立即读取同一条记录。该方法用Isolation.READ_UNCOMMITTED
注释,但我无法读取上面更新未提交的记录。
SQL 标准通过不为其定义任何隔离保证来定义 READ UNCOMMITTED
。换句话说,它不需要您实际看到该隔离级别中未提交的数据。
PostgreSQL 通过接受 READ UNCOMMITTED
来利用这一点,但实际上给你 READ COMMITTED
.
使用读锁操作的数据库通常使用 READ UNCOMMITTED
来解决该限制,但很难在 PostgreSQL.