REQUIRED: Это наиболее распространенный тип. Если метод, помеченный @Transactional, вызывается внутри другого метода, который уже выполняется в транзакции, то новая транзакция не создается. Вместо этого метод присоединяется к уже существующей транзакции. Если метод вызывается вне транзакционного контекста, создается новая транзакция.
REQUIRES_NEW: Всегда создает новую транзакцию. Если текущая транзакция существует, она будет приостановлена и создана новая транзакция для выполнения метода.
MANDATORY требует, чтобы текущая транзакция уже существовала при вызове метода. Если в момент вызова метода нет активной транзакции, то выбрасывается исключение IllegalTransactionStateException.
В примере выше, если бы метод doAction() сервиса FirstService не был бы помечен аннотацией @Transactiona, то было бы выброшено исключение.
NESTED: Создает вложенную транзакцию, которая является подчиненной внешней транзакции. Если внешняя транзакция откатывается, вложенная транзакция также будет откатываться, но если вложенная транзакция откатывается, внешняя транзакция не будет затронута.
SUPPORTS: Метод будет выполнен в контексте текущей транзакции, если она существует. В противном случае, он будет выполнен без транзакции.
NOT_SUPPORTED: Метод будет выполнен без текущей транзакции, даже если она существует.
NEVER: Метод не должен выполняться в контексте транзакции. Если текущая транзакция существует, будет выброшено исключение.