@ Транзакционная и сериализуемая проблема уровня - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с уровнями изоляции в JPA.Например, у меня есть следующий код:

@Transactional(isolation = Isolation.SERIALIZABLE)
public void first() {
    Obj obj = new Obj();
    obj.setName("t");
    objDAO.save(obj);
    second();
}

@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void second(){
    List<Obj> objs = objDAO.findAll();
}

По моему мнению, второй метод не должен видеть несвязанные изменения сначала метода.Поэтому новый объект с именем "t" не должен быть видимым до фиксации (но это так).Если я не прав, приведите, пожалуйста, пример в JPA, где его не будет видно.Большое спасибо за любые советы.

1 Ответ

0 голосов
/ 10 октября 2018

Если ваши методы находятся внутри одного класса, он не будет работать, потому что контейнер будет обрабатывать это как одну транзакцию.Контейнер не знает, что вы хотите создать новую транзакцию.

Из ссылки Spring:

Примечание. В режиме прокси (по умолчанию) только «внешний»вызовы методов, поступающие через прокси, будут перехвачены.Это означает, что «самовывоз», то есть метод в целевом объекте, вызывающий какой-либо другой метод целевого объекта, не приведет к реальной транзакции во время выполнения, даже если вызванный метод помечен как @Transactional!

Если вы хотите вызвать метод second () в новой транзакции, вы можете попробовать это:

@Autowired
private ApplicationContext applicationContext;

@Transactional(isolation = Isolation.SERIALIZABLE)
public void first() {
    Obj obj = new Obj();
    obj.setName("t");
    objDAO.save(obj);
    applicationContext.getBean(getClass()).second();
}

@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void second(){
    List<Obj> objs = objDAO.findAll();
}
...