2015-05-13 1 views
2

У меня есть вопрос о распространении весенних транзакций. Я понимаю разное распространение транзакций Spring, т. Е. Propagation.REQUIRED, Propagation.REQUIRES_NEW и т. Д. Я не совсем понимаю, как он будет вести себя в случае вложенных транзакций с разными значениями распространения.Spring @Transactional свойство распространения

Например, если я использую @Transactional(propagation = Propagation.REQUIRED), чтобы аннотировать метод m1. Если я вызываю метод m2, который аннотируется как REQUIRES_NEW. Каким будет поведение? Если исключение происходит в m2, оно откатит изменения в m2, а также m1 или только изменения m1. Аналогичным образом m1 аннотируется как REQUIRES_NEW и m2 как REQUIRED.

ответ

0

Это объясняется довольно хорошо в spring documentation for Transaction Propagation.

Поведение распространения метода определяет, как Spring ведет себя при входе/выходе этого метода, и что происходит, если транзакция уже существует (или не существует) в то время.

Способы распространения методов в стеке (независимо от того, что вызывает ваш метод) не имеют значения.

Для ваших примеров:

Outer (m1): REQUIRED
Внутренний (м2): REQUIRES_NEW
Результат: полностью отдельная транзакция будет создана м2, который может совершить/Откат отдельно. m1 с REQUIRED не имеет отношения к м2.

Outer (m1): REQUIRES_NEW
Внутренний (м2): REQUIRED
Результат: Spring будет проверять, что транзакция существует на входе м2 или создать, если он не существует.

+0

Благодарим takteek за предоставленную ссылку на весеннюю документацию. Я уже видел эту ссылку. В первую очередь я смотрю на поведение транзакции, когда два метода имеют разные уровни распространения. Взяв ваш первый пример, если я вношу некоторые изменения в методе m1, а затем называю m2, что произойдет, если исключение произойдет в m2. Все изменения, внесенные в м2, будут отброшены назад и что произойдет с изменением m1. Что произойдет, если в m1 есть исключение. Изменения m2 будут совершены или откат. – Vaishu13

+0

С 'REQUIRES_NEW' это отдельная физическая транзакция. Исключение из m2 приведет к откату транзакции m2. До тех пор, пока вы исключаете исключение из m1, m1 может совершить штраф. Настройка распространения m1 не имеет значения для m2. – takteek

+0

Спасибо. Можно ли объяснить это примером и более подробным объяснением. Я искал в Интернете, но я не нашел примеров для этого. Я думаю, что это более или менее общий прецедент, чтобы развить разное распространение, но недостаточно информации. – Vaishu13