Как сделать так, чтобы транзакция действовала только в методе, когда аннотированный транзакционный объект добавлен как в класс, так и в метод? - PullRequest
1 голос
/ 10 июля 2019

У меня было интервью, и во время интервью мне задали следующий вопрос: Когда аннотация @Transactional добавляется как к классу, так и к одному методу, но не к другим методам, как я могу только выполнить транзакцию этот метод эффективен?

Например:

@Transactional
public class ClassA {

     @Transactional
     private void methodA() {
     } 

     private void methodB() {
     }

     private void methodC() {
     }
}

Итак, как я могу убедиться, что другие транзакции в классе не вступают в силу? На чем сосредоточен этот вопрос?

1 Ответ

2 голосов
/ 11 июля 2019

Вы можете изменить тип распространения внутренней транзакции:

@Transactional(propagation = Propagation.REQUIRES_NEW)

Это создаст новую внутреннюю транзакцию и приостановит внешнюю транзакцию. Это может быть полезно, если вам нужна внутренняя транзакция для фиксации, но вам нужна внешняя транзакция для откатки, если есть какие-либо проблемы в другом месте.

Я никогда не использовал класс @Transactional, но свойство propagation на самом деле довольно полезно знать.

Я использовал его в нескольких случаях, чтобы переопределить значение по умолчанию Propagation.REQUIRED, которое гласит: «создать новую транзакцию, если она еще не существует - в противном случае поддержка текущая транзакция», в соответствии с Docs.

Кстати, я использую:

org.springframework.transaction.annotation.Transactional

Так что мой ответ не применяется, если вы используете альтернативу @Transactional

Также обратите внимание, что различие внутренней и внешней транзакции основано на HQL, поэтому вам не нужно беспокоиться о используемом вами диалекте SQL.

...