Какое значение propagation по умолчанию у аннотации @Transactional в Spring?

Ответ

По умолчанию используется Propagation.REQUIRED.

Что это означает:

  • Если транзакция уже существует, метод будет выполняться в её контексте.
  • Если активной транзакции нет, будет создана новая.

Пример явного указания (избыточного, так как это значение по умолчанию):

@Transactional(propagation = Propagation.REQUIRED)
public void processOrder(Order order) {
    // ...
}

Другие варианты распространения (Propagation):

  • REQUIRES_NEW – Всегда создает новую транзакцию, приостанавливая существующую.
  • SUPPORTS – Выполняется в транзакции, если она есть, и без неё, если нет.
  • MANDATORY – Требует наличия активной транзакции, иначе выбрасывается исключение.
  • NOT_SUPPORTED – Всегда выполняется без транзакции, приостанавливая существующую.
  • NEVER – Запрещает наличие транзакции, иначе выбрасывается исключение.
  • NESTED – Создает вложенную транзакцию, если она существует (работает с точками сохранения Savepoint).

Ответ 18+ 🔞

Слушай, а вот этот ваш @Transactional — он же по умолчанию, как собака сторож, на всё готовый. Не указал propagation — он уже думает за тебя: «Ага, Propagation.REQUIRED, значит, так и быть, сделаю».

Что это за зверь такой, REQUIRED?

  • Если вокруг уже есть транзакция — ну, типа, ты внутри другого @Transactional метода — то этот чувак просто спокойно в неё вписывается, как свой в доску. Не парится, не создаёт лишнего.
  • А если транзакции нет — он её создаёт, блядь, с нуля! Самый частый сценарий, обычный такой рабочий день.

Писать это — всё равно что воду в ступе толочь, оно и так работает:

@Transactional(propagation = Propagation.REQUIRED)
public void processOrder(Order order) {
    // ...
}

Но это ж только один из вариантов, ёпта! Их там, как тараканов за печкой, целая куча. Смотри, какие ещё бывают:

  • REQUIRES_NEW — Этот вообще отбитый. Ему похуй на твою текущую транзакцию. Он её приостанавливает и создаёт свою, новую, независимую. Как будто говорит: «Отойди, я сам всё сделаю, а потом разберёмся».
  • SUPPORTS — Пофигист конченый. Есть транзакция — ок, работает в ней. Нет транзакции — тоже ок, работает без неё. Никаких обязательств, чисто по дружбе.
  • MANDATORY — Истеричка. Орет: «Мне ОБЯЗАТЕЛЬНО нужна транзакция! Если её нет — я исключение кину, и всё тут!». Требует, чтобы его уже кто-то обернул.
  • NOT_SUPPORTED — Антитранзакционный маньяк. Даже если есть транзакция — он её приостановит и будет работать без неё. Вообще не признаёт эту вашу транзакционную магию.
  • NEVER — Его полная противоположность. Панически боится транзакций. Увидит активную — сразу в истерику: «Убери её! Я не буду в этом участвовать!» — и тоже исключением швыряется.
  • NESTED — Хитрый жук. Если транзакция есть, он создаёт внутри неё вложенную (через Savepoint). Если что-то пойдёт не так в этом вложенном блоке — откатится только он, а основная транзакция может жить дальше. Умно, но не все БД это поддерживают, ядрёна вошь.