powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / spring transaction propagation
6 сообщений из 6, страница 1 из 1
spring transaction propagation
    #39097611
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу разобраться с сабжектом.

допустим у нас есть сервис service1. Инжектим в него дао1 и дао2

внутри сервиса есть метод

Код: java
1.
2.
3.
4.
public void serviceMethod(){
     dao1.method1();
     dao2.method2();
}



Вот собственно на этом примере прошу помочь разобраться.

http://docs.spring.io/spring/docs/4.0.x/javadoc-api/org/springframework/transaction/annotation/Propagation.html MANDATORY
Support a current transaction, throw an exception if none exists.
NESTED
Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.
NEVER
Execute non-transactionally, throw an exception if a transaction exists.
NOT_SUPPORTED
Execute non-transactionally, suspend the current transaction if one exists.
REQUIRED
Support a current transaction, create a new one if none exists.
REQUIRES_NEW
Create a new transaction, suspend the current transaction if one exists.
SUPPORTS
Support a current transaction, execute non-transactionally if none exists.


Если method1() и method2() помечены MANDATORY
Надо, чтобы транзакция уже существовала. Если её нет, то будет эксепшн.

Если method1() и method2() помечены NESTED
В случае существования транзакции, будет создана вложенная транзакция для каждого из методов. Если транзакция отсутсувует - будет создана новая транзакция.
Вопрос. что такое вложенная транзакция? Если во вложенной транзакции что-то случится, то обрамляющая откачена не будет?

Если method1() и method2() помечены NEVER
транзакция не будет создана для внутренних методов и даже если serviceMethod выполняется в транзакции, то будет эксепшн. А если у меня JPA(hibernate) это вообще будет работать?

Если method1() и method2() помечены NOT_SUPPORTED
то же самое, что и NEVER. Отличается тем, что эксепшн не вываливает, а только приостанавливается транзакция.
Что значит приостановить транзакцию?

Если method1() и method2() помечены REQUIRED
методы выполняется в рамках транзакции serviceMethod. Если serviceMethod не в транзакции, то создадутся 2 транзакции для каждого из методов.

Если method1() и method2() помечены REQUIRES_NEW
для каждого из методов создастся новая транзакция(вложенная?). Транзакция метода serviceMethod приостанавливается(Что это значит?)

Если method1() и method2() помечены SUPPORTS
Если есть обрамляющая транзакция, то используется она. Если нет, выполняются не транзакционно. это как ?

P.S.
мои знания ограничиваются использованием spring+hibernate приложения.
...
Рейтинг: 0 / 0
spring transaction propagation
    #39097685
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторNEVER
Execute non-transactionally, throw an exception if a transaction exists.

никакой атомарности(и прочих CID), никаких ролбэков в случае runtime exception ?

но работать будет.
...
Рейтинг: 0 / 0
spring transaction propagation
    #39098295
Фотография JonnySKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЕсли method1() и method2() помечены NESTED
В случае существования транзакции, будет создана вложенная транзакция для каждого из методов. Если транзакция отсутсувует - будет создана новая транзакция.
Вопрос. что такое вложенная транзакция? Если во вложенной транзакции что-то случится, то обрамляющая откачена не будет?

Для методов будут созданы вложенные транзакции внутри текущей. Exception откатит вложенную транзакцию dao не откатывая служебную.

questionerЕсли method1() и method2() помечены NEVER
транзакция не будет создана для внутренних методов и даже если serviceMethod выполняется в транзакции, то будет эксепшн. А если у меня JPA(hibernate) это вообще будет работать?
Если метод вызывается в области видимости существующей транзакции, появится exception.

questionerЕсли method1() и method2() помечены NOT_SUPPORTED
то же самое, что и NEVER. Отличается тем, что эксепшн не вываливает, а только приостанавливается транзакция.
Что значит приостановить транзакцию?
Метод приостановит текущую транзакцию и не будет создавать новую до своего завершения.

questionerЕсли method1() и method2() помечены REQUIRES_NEW
для каждого из методов создастся новая транзакция(вложенная?). Транзакция метода serviceMethod приостанавливается(Что это значит?)
Приостанавливает текущую транзакцию, создает новую, и по завершении возобновляет приостановленную.

questionerЕсли method1() и method2() помечены SUPPORTS
Если есть обрамляющая транзакция, то используется она. Если нет, выполняются не транзакционно. это как ?
Если метод вызывается внутри области видимости транзакции то он выполняется внутри нее, если нет то новая транзакция не создается.

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

Насколько я понял.
...
Рейтинг: 0 / 0
spring transaction propagation
    #39098317
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JonnySKS,

авторДля методов будут созданы вложенные транзакции внутри текущей. Exception откатит вложенную транзакцию dao не откатывая служебную.

моя плохо понимать по-русски. Что такое служебная? к какому существительному относится?

Код: java
1.
2.
3.
4.
public void serviceMethod(){
     dao1.method1();
     dao2.method2();
}



serviceMethod не помечен @Transactional

method1() помечен @Transactional(propagation = PropagationType.REQUIRED)

method2() помечен @Transactional(propagation = PropagationType.SUPPORTS)

method2() выполнится в транзакции или нет?
...
Рейтинг: 0 / 0
spring transaction propagation
    #39098448
Фотография JonnySKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
Редактировал и "недоредактировал", служебную - имел в виду serviceMethod.

PropagationType.SUPPORTS выполнится, но вне транзакции.
Подробнее расписано тут
...
Рейтинг: 0 / 0
spring transaction propagation
    #39098450
Фотография JonnySKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / spring transaction propagation
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]