|
|
|
spring transaction propagation
|
|||
|---|---|---|---|
|
#18+
Хочу разобраться с сабжектом. допустим у нас есть сервис service1. Инжектим в него дао1 и дао2 внутри сервиса есть метод Код: java 1. 2. 3. 4. Вот собственно на этом примере прошу помочь разобраться. 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 приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2015, 15:17 |
|
||
|
spring transaction propagation
|
|||
|---|---|---|---|
|
#18+
авторNEVER Execute non-transactionally, throw an exception if a transaction exists. никакой атомарности(и прочих CID), никаких ролбэков в случае runtime exception ? но работать будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2015, 17:46 |
|
||
|
spring transaction propagation
|
|||
|---|---|---|---|
|
#18+
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 Если есть обрамляющая транзакция, то используется она. Если нет, выполняются не транзакционно. это как ? Если метод вызывается внутри области видимости транзакции то он выполняется внутри нее, если нет то новая транзакция не создается. Есть еще нюансы с областью видимости транзакций связанные с измененными не закоммиченными данными. Если запрос делается из существующей транзакции, то будут видны измененные но не закоммиченные данные в этой транзакции. Насколько я понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 13:22 |
|
||
|
spring transaction propagation
|
|||
|---|---|---|---|
|
#18+
JonnySKS, авторДля методов будут созданы вложенные транзакции внутри текущей. Exception откатит вложенную транзакцию dao не откатывая служебную. моя плохо понимать по-русски. Что такое служебная? к какому существительному относится? Код: java 1. 2. 3. 4. serviceMethod не помечен @Transactional method1() помечен @Transactional(propagation = PropagationType.REQUIRED) method2() помечен @Transactional(propagation = PropagationType.SUPPORTS) method2() выполнится в транзакции или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 13:35 |
|
||
|
spring transaction propagation
|
|||
|---|---|---|---|
|
#18+
questioner, Редактировал и "недоредактировал", служебную - имел в виду serviceMethod. PropagationType.SUPPORTS выполнится, но вне транзакции. Подробнее расписано тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 14:45 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=112&tid=2124699]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 390ms |

| 0 / 0 |
