Довелось мне тут на днях побывать на очередном собеседовании. И задали мне там вот такой вот вопрос. Что на самом деле выполнится (с точки зрения транзакций), если вызвать 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