У меня есть два метода репозитория 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
, но я не могу прочитать вышеуказанную обновленную незафиксированную запись.