Невозможно прочитать незафиксированные данные, используя уровень изоляции Spring JPA READ_UNCOMMITTED - PullRequest
0 голосов
/ 15 января 2020

У меня есть два метода репозитория 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() Я обновляю объект person, сбрасывая запись, я думаю, transaction будет зафиксировано после вызова метода завершается, т.е. запись останется в незафиксированном состоянии из-за Thread.sleep

Теперь в readUncommitted() Я пытаюсь прочитать ту же запись через мгновение после запуска updatePerson(). Метод помечен Isolation.READ_UNCOMMITTED, но я не могу прочитать вышеуказанную обновленную незафиксированную запись.

1 Ответ

0 голосов
/ 15 января 2020

Стандарт SQL определяет READ UNCOMMITTED, не определяя никаких гарантий изоляции. Другими словами, это не требует, чтобы вы действительно видели незафиксированные данные на этом уровне изоляции.

PostgreSQL использует это, принимая READ UNCOMMITTED, но фактически предоставляя вам READ COMMITTED.

Базы данных, которые работают с блокировками чтения, обычно используют READ UNCOMMITTED, чтобы обойти это ограничение, но в PostgreSQL.

сложно найти варианты использования.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...