Уровни распространения транзакций в Spring определяют, как методы, помеченные как транзакционные, взаимодействуют друг с другом, если один метод вызывает другой. Уровень распространения определяет, нужно ли создавать новую транзакцию, присоединяться к существующей или вообще не использовать транзакцию.
Основные уровни распространения в Spring:
REQUIRED: Использует существующую транзакцию, если она есть. Если нет, создает новую. Это уровень по умолчанию.
java
SUPPORTS: Использует существующую транзакцию, если она есть. Если нет, выполняется без транзакции.
java
MANDATORY: Использует существующую транзакцию. Если ее нет, выбрасывает исключение TransactionRequiredException.
java
NEVER: Выполняется без транзакции. Если существующая транзакция есть, выбрасывает исключение IllegalTransactionStateException.
java
NOT_SUPPORTED: Выполняется без транзакции. Если существующая транзакция есть, она будет приостановлена на время выполнения этого метода.
java
REQUIRES_NEW: Всегда создает новую, независимую транзакцию. Если существующая транзакция есть, она будет приостановлена. У новой транзакции свой коммит и откат, независимый от внешней.
java
NESTED: Использует существующую транзакцию, если она есть, создавая вложенную транзакцию (Savepoint). Если ее нет, работает как REQUIRED. Вложенную транзакцию можно откатить до Savepoint, не затрагивая внешнюю транзакцию, но коммит вложенной транзакции зависит от коммита внешней.
java
Выбор уровня распространения важен для правильного управления транзакциями и обеспечения целостности данных при вызове транзакционных методов друг из друга.