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

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

@Transactional(propagation=Propagation.REQUIRED)

Спасибо

5 ответов

Решение

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

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

Если вам нужно непрофессиональное объяснение использования, которое не предусмотрено в Spring Docs

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

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

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

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

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

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

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

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

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

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

Прочитайте управление транзакциями для получения дополнительной информации.

Другие вопросы по тегам