Создает ли вложенный @Transactional (распространение = Propagation.REQUIRES_NEW) новый Hibernate-сеанс? - PullRequest
0 голосов
/ 04 мая 2018

При запуске новой транзакции, используя @Transactional(propagation = Propagation.REQUIRES_NEW) в текущей транзакции, которая была запущена с помощью @Transactional(propagation = Propagation.REQUIRED), создается новый сеанс для новой транзакции?

Можно ли использовать только один сеанс для всех транзакций, если вышеприведенное верно?

Вот наглядный пример:

@Transactional(propagation = Propagation.REQUIRED
public void startParentTransaction() {

    ChildObject childObject = newChildTransaction();
    childObject.lazyLoadedAttribute();

    ChildObject childObject = newChildTransaction();
    childObject.lazyLoadedAttribute();
}

@Transactional(propagation = Propagation.REQUIRES_NEW
public ChildObject newChildTransaction() {

    ChildObject childObject = callRepositoryOrDao();
    childObject.changeState();
    return childObject;
}

Будет ли работать звонок на childOjbect.lazyLoadedAttribute()? Или будет LazyInitializationException брошен?

Можем ли мы сделать так, чтобы все транзакции происходили за один Session?

1 Ответ

0 голосов
/ 04 мая 2018

Вы привязаны к весне @Transactional аннотация.

Обычно Propagation.REQUIRE_NEW запускает новую транзакцию, даже если она существует.

Но если вы вызываете newChildTransaction локально (просто в рамках того же метода), то у пружинного АОП не будет возможности взаимодействовать с аннотацией @Transaction.

Следовательно, в этом случае newChildTransaction() использует существующую транзакцию

...