Отвечая на этот комментарий, а не на фактический вопрос:
транзакции зависят от сеанса или запроса — Vish 3 часа назад
Ни один. запрос и сеанс являются специфичными для Интернета областями, в то время как абстракция Spring Transaction не имеет ничего общего с веб-технологиями.
Область действия @Transactional
определяется вызовом метода, поскольку @Transactional
реализуется через Spring AOP. Состояние транзакции хранится в переменных ThreadLocal
, которые инициализируются при входе в самый внешний метод @Transactional
и очищаются с помощью фиксации или отката, когда он остается. Вся эта абстракция работает на уровне методов Java и, следовательно, не требует использования веб-контейнера.
И в ответ на этот вопрос в комментарии ниже:
спасибо @sean, я все еще не могу получить ответ, где используется другое поведение распространения, такое как PROPAGATION_SUPPORTS, PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW и т. д. пожалуйста, обратитесь выше для всего вопроса
Вот список Propagation
с моими комментариями:
ОБЯЗАТЕЛЬНО
Поддерживать текущую транзакцию, создавать исключение, если его не существует.
Не запускает новую транзакцию, просто проверяет, активна ли транзакция (должна быть внутри либо другого вызова метода @Transactional
, либо программно созданной транзакции)
ВКЛАДЫВАНИЕ
Выполнение во вложенной транзакции, если текущая транзакция существует, ведет себя как PROPAGATION_REQUIRED
в противном случае.
Запустите вложенную транзакцию, если транзакция существует, в противном случае запустите новую транзакцию.
НИКОГДА
Выполнять без транзакции, создавать исключение, если транзакция существует.
Не запускает транзакцию. Сбой, если транзакция присутствует.
NOT_SUPPORTED
Выполнение без транзакции, приостановка текущей транзакции, если она существует.
Не запускает транзакцию. Приостанавливает любую существующую транзакцию.
ОБЯЗАТЕЛЬНО
Поддержите текущую транзакцию, создайте новую, если таковой не существует.
Если транзакция существует, используйте ее, если нет, создайте новую. В 95 % случаев это то, что вам нужно.
REQUIRES_NEW
Создать новую транзакцию, приостановить текущую транзакцию, если она существует.
Всегда создает новую транзакцию, независимо от того, присутствует ли существующая транзакция. Если есть, он будет приостановлен на время выполнения этого метода.
ПОДДЕРЖКА
Поддерживает текущую транзакцию, выполняется без транзакции, если таковой не существует.
Может использовать транзакцию, если она присутствует, но не нуждается в ней (и не будет запускать новую)
В большинстве случаев вам нужно REQUIRED
(поэтому это значение по умолчанию в аннотации @Transactional
). Я лично никогда не видел никаких других значений, кроме REQUIRED
и REQUIRES_NEW
в использовании.
person
Sean Patrick Floyd
schedule
05.04.2011