Распространение поведения транзакции - PullRequest
8 голосов
/ 05 апреля 2011

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

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

}
}

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

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

сбой любого метода, такого как method2, method3, приведет к откату транзакции?

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

Ответы [ 3 ]

34 голосов
/ 05 апреля 2011

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

транзакция зависит от сеанса или запроса - 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 в использовании.

3 голосов
/ 05 апреля 2011

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

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

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

0 голосов
/ 05 апреля 2011

Да. require_New означает, что каждый запрос будет начинать новую транзакцию.и Да, сбой в method2, method3 вызовет откат транзакции, в зависимости от свойств отката.check Transactional properties.

...