@Transactional (распространение = Propagation.REQUIRED)

если кто-то может объяснить, что делает эта аннотация, и когда именно мы ее используем:

@Transactional(propagation=Propagation.REQUIRED)

Спасибо

Ответ 1

Когда параметр распространения PROPAGATION_REQUIRED, создается область логической транзакции для каждого метода, на который применяется эта настройка. Каждая такая область логической транзакции может определять статус отката только по отдельности, при этом внешняя область транзакции логически независима от области внутренней транзакции. Конечно, в случае стандартного поведения PROPAGATION_REQUIRED все эти области будут сопоставлены с одной и той же физической транзакцией. Таким образом маркер только для отката, установленный во внутренней области транзакции, влияет на вероятность внешней транзакции на фактическую фиксацию (как и следовало ожидать).

enter image description here

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

Ответ 2

Если вам нужно объяснение laymans использования, выходящего за рамки, предусмотренные в Spring Документах

Рассмотрим этот код...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

Когда doSomething() вызывается, он знает, что перед выполнением должен запустить транзакцию в базе данных. Если вызывающий объект этого метода уже начал транзакцию, тогда этот метод будет использовать ту же физическую транзакцию для текущего соединения с базой данных.

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

Управление транзакциями - довольно сложный вопрос, поэтому, надеюсь, этот упрощенный ответ будет полезен

Ответ 3

В приложениях Spring, если вы включаете поддержку транзакций на основе аннотаций с помощью <tx:annotation-driven/> и аннотируете любой класс/метод с помощью @Transactional (распространение = распространение)., тогда начнется структура Spring транзакции и выполняет этот метод и совершает транзакцию. Если возникло какое-либо RuntimeException, транзакция будет отменена.

Фактически распространение = распространение .REQUIRED - это уровень распространения по умолчанию, вам не нужно явно упоминать его.

Для получения дополнительной информации: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations

Ответ 4

Spring REQUIRED поведение означает, что same transaction будет использоваться , если существует уже открытая транзакция в текущем контексте выполнения bean. Если существует нет существующей транзакции, контейнер Spring будет создать новый. Если несколько методов, настроенных как поведение REQUIRED, вызывают вложенным образом, им будут назначены разные логические транзакции, но все они будут совместно использовать одну и ту же физическую транзакцию. Короче говоря, это означает, что если внутренний метод вызывает откат транзакции, внешний метод не сможет выполнить транзакцию и также откатится от транзакции

Ответ 5

Чтобы понять различные параметры транзакций и поведения, принятые для управления транзакциями, например REQUIRED, ISOLATION и т.д., вам нужно будет понять основы самого управления транзакциями.

Подробнее читайте Управление трассировкой.