Ответ
По умолчанию используется 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). Если что-то пойдёт не так в этом вложенном блоке — откатится только он, а основная транзакция может жить дальше. Умно, но не все БД это поддерживают, ядрёна вошь.