Что произойдет, если один @Transactional аннотированный метод вызывает другой @ Transactional аннотированный метод на том же экземпляре объекта? [дубликат]
На этот вопрос уже есть ответ здесь:
Я изучаю, как Spring обрабатывает транзакцию, и я спрашиваю, Что происходит, если один @Transactional
аннотированный метод вызывает другой @Transactional
аннотированный метод на том же экземпляре объекта?
Я знаю. что уровень дефолта распространения транзакций является REQUIRED
, поэтому если у меня есть method1()
, аннотированный @Transactional
экземпляра MyObject
, который вызывает method2()
(аннотированный @Transactional
) того же экземпляра, я думаю, что, следуя уровню REQUIRED
, он выполняется на той же транзакции, созданной method1()
.
@Transactional
метода будут вызваны в одном экземпляре.
Как это работает?
1 ответ:
Если вы вызываете
method2()
изmethod1()
внутри того же класса, то аннотация@Transactional
второго метода не будет иметь никакого эффекта, потому что он вызывается не через прокси, а напрямую. Методы усиливаются транзакционным поведением только в том случае, если вызываются через прокси (autowired bean или какой-либо экземпляр, введенный любым другим способом).Но вообще говоря, если
method1()
иmethod2()
были в разных классах, и оба были аннотированы@Transactional
(таким образом, используяREQUIRED
распространение), то они были бы одинаковыми транзакция началась вmethod1()
.