Что произойдет, если один @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().