если кто-нибудь может объяснить, что делает эта аннотация и когда именно мы ее используем:
@Transactional(propagation=Propagation.REQUIRED)
Спасибо
если кто-нибудь может объяснить, что делает эта аннотация и когда именно мы ее используем:
@Transactional(propagation=Propagation.REQUIRED)
Спасибо
Ответы:
Когда параметр распространения - 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
аннотация позволяет сообщить вашему коду, когда он выполняется, что у него должна быть транзакция. Он не будет работать без него, поэтому вы можете сделать это предположение в своем коде, что вы не останетесь с неполными данными в своей базе данных или вам придется что-то очищать в случае возникновения исключения.
Управление транзакциями - довольно сложная тема, поэтому, надеюсь, этот упрощенный ответ будет вам полезен.
@Transactional
на свой уровень сервиса, нет необходимости добавлять @Transactional
также методы DAO, вызываемые в этой транзакции.
doSomething()
вызывает другой вложенный метод без @transactional, будет ли эта же транзакция применяться к этому методу вызова?
В приложениях Spring, если вы включите поддержку транзакций на основе аннотаций, используя <tx:annotation-driven/>
и аннотируя любой класс / метод с помощью @Transactional (пропаганда = Propagation.REQUIRED), то среда Spring начнет транзакцию, выполнит метод и зафиксирует транзакцию. Если возникнет какое-либо исключение RuntimeException, транзакция будет отменена.
На самом деле Propagation = Propagation.REQUIRED - это уровень распространения по умолчанию, вам не нужно явно указывать его.
Для получения дополнительной информации: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations.
Чтобы понять различные настройки и поведение транзакций, используемые для управления транзакциями, например REQUIRED
, ISOLATION
и т. Д., Вам необходимо понять основы самого управления транзакциями.
Прочтите Управление транзакциями для получения дополнительной информации.