Ответ
Атрибут propagation определяет, как должна вести себя транзакция, если она вызывается в контексте уже существующей транзакции.
Основные значения и их поведение:
| Значение | Поведение |
|---|---|
REQUIRED (по умолчанию) |
Использует текущую транзакцию, если она есть. Если нет — создает новую. |
REQUIRES_NEW |
Всегда создает новую, независимую транзакцию. Текущая транзакция приостанавливается. |
SUPPORTS |
Выполняется в существующей транзакции, если она есть. Если нет — работает без транзакции. |
NOT_SUPPORTED |
Выполняется без транзакции. Текущая транзакция приостанавливается. |
MANDATORY |
Требует активной транзакции. Если ее нет — выбрасывается исключение. |
NEVER |
Требует отсутствия транзакции. Если она есть — выбрасывается исключение. |
NESTED |
Создает вложенную транзакцию (точка сохранения) внутри текущей. Поддерживается не всеми СУБД. |
Пример использования REQUIRES_NEW:
@Service
public class LogService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void auditLog(String action) {
// Эта операция будет зафиксирована в БД в своей транзакции,
// даже если основная транзакция будет откачена.
logRepository.save(new AuditLog(action));
}
}