@Transactional (распространение = распространение. ОБЯЗАТЕЛЬНО)


107

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

@Transactional(propagation=Propagation.REQUIRED)

Спасибо



3
Propagation.REQUIRED - это режим распространения транзакции по умолчанию, поэтому вам не нужно явно его устанавливать.
tibtof

Ответы:


65

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

введите описание изображения здесь

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


167

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

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

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

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

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

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



если он использует конфигурацию на основе прокси для объявления и доступа к слою DAO, метод в классе DAO также должен быть аннотирован с помощью @Transactional.
Курапика

Если вы добавили @Transactionalна свой уровень сервиса, нет необходимости добавлять @Transactionalтакже методы DAO, вызываемые в этой транзакции.
Брэд

если doSomething()вызывает другой вложенный метод без @transactional, будет ли эта же транзакция применяться к этому методу вызова?
thisarattr

Да, если тот же поток используется для выполнения вложенного метода (т.е. вы не создаете новый поток явно). Это связано с тем, что транзакции Spring привязаны к текущему потоку с использованием переменных ThreadLocal
Брэд

15

В приложениях 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.


5

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.