Middle+
Πείτε μας για τους τύπους propagation στην ετικέτα @Transactional. Έχετε χρησιμοποιήσει ποτέ τύπους που δεν είναι προεπιλεγμένοι;
sobes.tech AI
Απάντηση από AI
В аннотации @Transactional в Spring есть параметр propagation, который определяет, как должна вести себя транзакция при вызове метода внутри уже существующей транзакции.
Основные типы propagation:
REQUIRED(по умолчанию): если есть текущая транзакция, метод выполняется в ней, иначе создаётся новая.REQUIRES_NEW: всегда создаёт новую транзакцию, существующая приостанавливается.SUPPORTS: если есть транзакция, использовать её, иначе выполнять без транзакции.NOT_SUPPORTED: всегда выполнять без транзакции, приостанавливая существующую.MANDATORY: должен быть вызван внутри транзакции, иначе исключение.NEVER: должен быть вызван вне транзакции, иначе исключение.NESTED: если есть транзакция, создать вложенную (savepoint), иначе какREQUIRED.
Использование не дефолтных propagation полезно, когда нужно контролировать границы транзакций, например:
REQUIRES_NEWдля независимых операций, чтобы ошибки в них не откатывали основную транзакцию.NESTEDдля частичного отката внутри большой транзакции.
Пример:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveAudit() {
// сохраняем аудит независимо от основной транзакции
}