Довелось мне тут на днях побывать на очередном собеседовании. И задали мне там вот такой вот вопрос. Что на самом деле выполнится (с точки зрения транзакций), если вызвать method1()? 
 
    public class MyServiceImpl {
    
      @Transactional
      public void method1() {
        //do something
        method2();
      }
    
      @Transactional (propagation=Propagation.REQUIRES_NEW)
      public void method2() {
        //do something
      }
    }
 
 Ну, мы же все умные, документацию читаем или, по крайней мере, видео выступлений Евгения Борисова смотрим. Соответственно и правильный\* ответ знаем (правильный\* — это такой, который от нас ожидает услышать тот, кто спрашивает). И звучать он должен примерно так. 
 
 «_В связи с тем, что для поддержки транзакций через аннотации используется Spring AOP, в момент вызова method1() на самом деле вызывается метод прокси объекта. Создается новая транзакция и далее происходит вызов method1() класса MyServiceImpl. А когда из method1() вызовем method2(), обращения к прокси нет, вызывается уже сразу метод нашего класса и, соответственно, никаких новых транзакций создаваться не будет_». 
 
 Но знаете, как это бывает, вроде и ответ правильный уже давно знаешь. И применяешь это знание регулярно. А вдруг раз… и неожиданно задумаешься: «_Подождите-ка, ведь если мы используем Spring AOP, то там могут создаваться прокси и через JDK, а могут и с CGLIB; а еще возможно, что CTW или LTW подключили. И что такой ответ всегда будет верен?_». 
 
 Ну что ж: интересно? Надо проверить. 
[Читать дальше →][1]
  [1]: 
https://habrahabr.ru/post/347752/?utm_source=habrahabr&utm_medium=rss&utm_campaign=347752#habracut