если кто-то может объяснить, что делает эта аннотация, и когда именно мы ее используем:
@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
Если вам нужно объяснение laymans использования, выходящего за рамки, предусмотренные в Spring Документах
Рассмотрим этот код...
class Service {
@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {
// access a database using a DAO
}
}
Когда doSomething() вызывается, он знает, что перед выполнением должен запустить транзакцию в базе данных. Если вызывающий объект этого метода уже начал транзакцию, тогда этот метод будет использовать ту же физическую транзакцию для текущего соединения с базой данных.
Эта аннотация @Transactional
предоставляет способ сообщить ваш код, когда он выполнит, что он должен иметь транзакцию. Он не будет работать без одного, поэтому вы можете сделать это предположение в своем коде, что вы не останетесь с неполными данными в своей базе данных, или вам нужно что-то очистить, если возникло исключение.
Управление транзакциями - довольно сложный вопрос, поэтому, надеюсь, этот упрощенный ответ будет полезен
В приложениях 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
Spring REQUIRED
поведение означает, что same transaction
будет использоваться , если существует уже открытая транзакция в текущем контексте выполнения bean. Если существует нет существующей транзакции, контейнер Spring будет создать новый. Если несколько методов, настроенных как поведение REQUIRED
, вызывают вложенным образом, им будут назначены разные логические транзакции, но все они будут совместно использовать одну и ту же физическую транзакцию. Короче говоря, это означает, что если внутренний метод вызывает откат транзакции, внешний метод не сможет выполнить транзакцию и также откатится от транзакции
Чтобы понять различные параметры транзакций и поведения, принятые для управления транзакциями, например REQUIRED
, ISOLATION
и т.д., вам нужно будет понять основы самого управления транзакциями.
Подробнее читайте Управление трассировкой.