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