Поведение транзакции

Я использую декларативный подход на основе аннотаций для Spring AOP. образец кода

ClassA{
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
add()
{
method1();
method2();
method3();

}
}

Но у меня все еще есть сомнения по поводу использования propagation.does propagation.Requires_New означает, что каждый запрос будет запускать новую транзакцию.

Второй вопрос:

Приводит ли сбой любого метода, такого как метод2, метод3, к откату транзакции?

Я буду очень рад, если кто-нибудь поможет мне в распространении транзакций.

может ли кто-нибудь предоставить мне реальный пример, где нам нужно участвовать в существующей транзакции. Потому что я визуализирую, что функция добавления, которую мы используем в приведенном выше примере, будет независимой для всех пользователей, или любая другая функция будет независимой для каждого пользователя, который звонит . Я не могу найти пример, где используется другое поведение распространения, такое как PROPAGATION_SUPPORTS, PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW и т. д.


person Vish    schedule 05.04.2011    source источник


Ответы (3)


Отвечая на этот комментарий, а не на фактический вопрос:

транзакции зависят от сеанса или запроса — 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
comment
спасибо @sean, я все еще не могу получить ответ, где используется другое поведение распространения, такое как PROPAGATION_SUPPORTS, PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW и т. д. пожалуйста, обратитесь выше для всего вопроса - person Vish; 06.04.2011
comment
Спасибо @Sean.so, если несколько запросов вызывают один и тот же метод, скажем, ADD(), аннотация REQUIRED заставит их выполняться в одной и той же транзакции??. но я думаю, что все вызовы метода Add() будут независимы друг от друга с точки зрения транзакции.. все еще есть небольшая путаница - person Vish; 06.04.2011
comment
@ Виш Нет, никогда. Новый запрос всегда означает вызов нового метода в новом потоке и, следовательно, новую транзакцию. Все эти транзакционные вещи происходят внутри одного вызова метода, самого внешнего. Это становится сложным, когда внешний метод вызывает внутренний транзакционный метод, но двойной вызов внешнего метода означает две транзакции, независимо от того, находится ли он в веб-контексте или нет. - person Sean Patrick Floyd; 06.04.2011
comment
+1 Замечательное объяснение. Не могли бы вы объяснить? Состояние транзакции хранится в переменных ThreadLocal, которые инициализируются при входе в самый внешний метод @Transactional и очищаются с помощью фиксации или отката, когда он остается. - person Tapas Bose; 29.12.2012
comment
@ Шон Патрик Флойд, пожалуйста, объясните разницу между распространением НИКОГДА и вообще не отмечайте метод транзакционным - person gstackoverflow; 08.11.2015
comment
@gstackoverflow нет. но поскольку аннотация наследуется, вы можете использовать propagation=NEVER на уровне метода, чтобы отключить обработку транзакций для отдельных методов. - person Sean Patrick Floyd; 08.11.2015
comment
Я не поймал тебя. Я не могу понять, что вы имеете в виду о наследовании аннотаций - person gstackoverflow; 08.11.2015
comment
@gstackoverflow, если класс помечен как @Transactional, но вы хотите отключить его для отдельных методов - person Sean Patrick Floyd; 08.11.2015
comment
Могу ли я узнать, что именно означает нетранзакционно, так как я свежее - person Gen; 28.06.2016

Распространение транзакции указывает, каким должно быть поведение данного метода при его вызове. REQUIRES_NEW означает, что новая транзакция всегда должна начинаться, даже если транзакция уже выполняется.

Если method1(), например, определяет REQUIRES_NEW, то он будет выполняться в новой транзакции.

Исключение откатит текущую активную транзакцию, да.

person Bozho    schedule 05.04.2011

Да. Requires_New означает, что каждый запрос будет запускать новую транзакцию. и Да, сбой в методе 2, методе 3 приведет к откату транзакции в зависимости от свойств отката. проверьте свойства Transactional .

person Manoj    schedule 05.04.2011
comment
транзакция зависит от сеанса или запроса - person Vish; 05.04.2011