首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Spring JPA READ_UNCOMMITTED隔离级别读取未提交的数据

无法使用Spring JPA READ_UNCOMMITTED隔离级别读取未提交的数据
EN

Stack Overflow用户
提问于 2020-01-15 16:09:58
回答 1查看 398关注 0票数 0

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

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

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

代码语言:javascript
复制
@GetMapping( "update" )
public String updatePerson( ) throws InterruptedException {
    return managerService.updatePerson();
}

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

JPA存储库方法:

代码语言:javascript
复制
@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,记录将保持未提交状态

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-16 01:24:24

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59747276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档