Если у меня есть следующий код:

@Component
public class A{ 

@Transactional(propagation = Propagation.REQUIRED)
public void a(){
    //logic
    b();
 //logic
}

@Transactional(propagation = Propagation.REQUIRED)
public void b(){
    //logic
} 
}

Сколько транзакций открывается Spring в этом примере кода?

0
Иван Гладуш 26 Фев 2018 в 11:39

4 ответа

Лучший ответ

Это не важно При вызове b() из a() он не будет проходить через прокси, поэтому любые транзакционные атрибуты b() не будут учитываться.

В примере кода есть 1 открытая транзакция, если a() или b() вызывается через прокси-сервер (то есть вне класса), и транзакция уже не выполняется.

3
Kayaman 26 Фев 2018 в 09:20

Из весенней документации: https: //docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html

ТРЕБУЕТСЯ: поддерживать текущую транзакцию, создать новую, если ее нет

Он создает только одну транзакцию.

2
Pablo 26 Фев 2018 в 08:46

Ссылаясь на документацию Propagation.REQUIRED поддерживает текущую транзакцию, создайте новую, если ее не существует. Ответ на ваш вопрос:

1 транзакция, если нет транзакции, когда вызывается A # a ().

0 - ноль, если он уже есть, потому что он будет использоваться повторно.

1
Montassar El Béhi 26 Фев 2018 в 08:49

Я добавляю к @pablo ответ на уведомление, что в вашем примере вы не можете увидеть фактическую разницу, потому что вы вызываете свой метод в том же объекте, что делает поведение @transaction во втором методе прозрачным без эффекта:

В режиме прокси (который используется по умолчанию) перехватываются только внешние вызовы методов, поступающие через прокси. Это означает, что самовывоз, по сути, метод в целевом объекте, вызывающий другой метод целевого объекта, не приведет к фактической транзакции во время выполнения, даже если вызванный метод помечен @Transactional

3
elmehdi 26 Фев 2018 в 08:51