Что произойдет, если один @Transactional аннотированный метод вызывает другой @ Transactional аннотированный метод на том же экземпляре объекта? [дубликат]


На этот вопрос уже есть ответ здесь:

Я изучаю, как Spring обрабатывает транзакцию, и я спрашиваю, Что происходит, если один @Transactional аннотированный метод вызывает другой @Transactional аннотированный метод на том же экземпляре объекта?

Я знаю. что уровень дефолта распространения транзакций является REQUIRED, поэтому если у меня есть method1(), аннотированный @Transactional экземпляра MyObject, который вызывает method2() (аннотированный @Transactional) того же экземпляра, я думаю, что, следуя уровню REQUIRED, он выполняется на той же транзакции, созданной method1().

Правильно ли я рассуждаю, или я что-то упускаю? Я не уверен, что именно произойдет, если 2 @Transactional метода будут вызваны в одном экземпляре.

Как это работает?

1 2

1 ответ:

Если вы вызываете method2() из method1() внутри того же класса, то аннотация @Transactional второго метода не будет иметь никакого эффекта, потому что он вызывается не через прокси, а напрямую. Методы усиливаются транзакционным поведением только в том случае, если вызываются через прокси (autowired bean или какой-либо экземпляр, введенный любым другим способом).

Но вообще говоря, если method1() и method2() были в разных классах, и оба были аннотированы @Transactional (таким образом, используя REQUIRED распространение), то они были бы одинаковыми транзакция началась в method1().