Вопрос проверяет понимание поведения транзакций в Spring при использовании аннотации @Transactional с propagation = REQUIRES_NEW, что необходимо для изоляции критических операций.
В Spring Framework аннотация @Transactional позволяет управлять границами транзакций декларативно. Одним из ключевых атрибутов этой аннотации является propagation, который определяет, как должна вести себя транзакция, если она уже существует в текущем контексте выполнения.
Поведение Propagation.REQUIRES_NEW означает, что метод всегда запускается в новой, независимой физической транзакции. Если на момент вызова метода уже существует активная транзакция (например, в вызывающем методе), она временно приостанавливается. Spring создаёт новую транзакцию, выполняет метод внутри неё, а после завершения (коммита или отката) возобновляет предыдущую, приостановленную транзакцию.
@Service
public class OrderService {
@Transactional
public void placeOrder(Order order) {
// Основная бизнес-логика, работающая в транзакции "A"
orderRepository.save(order);
// Вызов метода с REQUIRES_NEW
auditService.logEvent("Order placed", order.getId());
// Если здесь выбросится исключение, транзакция "A" откатится,
// но запись в логе, сделанная auditService, уже сохранена.
}
}
@Service
public class AuditService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logEvent(String message, Long entityId) {
// Этот метод всегда выполняется в новой транзакции "B"
AuditLog log = new AuditLog(message, entityId);
auditLogRepository.save(log);
// Транзакция "B" коммитится здесь, независимо от судьбы "A".
}
}Вывод: Используйте REQUIRES_NEW, когда вам необходимо гарантировать сохранение результата операции (например, логирования) вне зависимости от успешности или отката основной бизнес-транзакции. Это обеспечивает надёжность для критически важных некоррелированных действий.