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

107

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

@Transactional(propagation=Propagation.REQUIRED)

Спасибо

Адиль
источник
2
Вы это читали? static.springsource.org/spring/docs/2.5.x/reference/…
Брэд,
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и т. Д., Вам необходимо понять основы самого управления транзакциями.

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

Битовая карта
источник