@EnableTransactionManagement в Spring Загрузка

Требуется ли @EnableTransactionManagement в Spring Boot? Я провел некоторое исследование. Некоторые люди говорят, что вам это не нужно, поскольку Spring Boot уже активирован, другие говорят, что вам нужно использовать его явно. Итак, как это?

Ответы

Ответ 1

Возможно, вы также используете данные Spring. Вызовы Spring Хранилища данных по умолчанию окружены транзакцией, даже без @EnableTransactionManagement. Если Spring Data обнаружит существующую транзакцию, существующая транзакция будет повторно использована, иначе будет создана новая транзакция.

Тем не менее,

@Аннотации Tranceactional в вашем собственном коде оцениваются только при активированном @EnableTransactionManagement (или сконфигурированной обработке транзакций другим способом).

Вы можете легко отслеживать поведение транзакций, добавляя к свойству application.properties следующее свойство:

logging.level.org.springframework.transaction.interceptor=TRACE

(см. Отображение транзакции Spring в журнале)

Ответ 2

Согласно > https://spring.io/guides/gs/managing-transactions/

Spring Boot будет обнаруживать spring -jdbc в пути к классам и h2 и будет автоматически создавать DataSource и JdbcTemplate. Поскольку такая инфраструктура теперь доступна и у вас нет выделенной конфигурации, для вас также будет создан DataSourceTransactionManager: это компонент, который перехватывает аннотированный метод @Transactional.

Вы также можете использовать spring -boot-starter-actuator, чтобы перечислить ваш beans, созданный в вашем контексте, и вы найдете его

bean ":" transactionManager "

Ответ 3

Маленький старый пост, но ответы, данные ранее, не были прямыми, когда я искал его.

@EnableTransactionManagement является необязательным при загрузке Spring при условии, что @EnableTransactionManagement * или spring-tx находятся в classpath. Как это устроено? Как показано ниже:

Spring boot добавляет в путь к классу файл spring-boot-autoconfigure.jar. Перейдите в файл META-INF spring.factories, и вы увидите org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration запись org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration. Это инициализирует автоматическую настройку транзакции для вас.

Обратите внимание, что класс имеет следующие строки: (фрагмент)

@Configuration
@ConditionalOnClass({PlatformTransactionManager.class})
@AutoConfigureAfter({JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, Neo4jDataAutoConfiguration.class})
@EnableConfigurationProperties({TransactionProperties.class})
public class TransactionAutoConfiguration {
..
}

Взгляните на TransactionAutoConfiguration и убедитесь, что он включает поддержку транзакций, если PlatformTransactionManager доступен в classpath. EnableTransactionManagementConfiguration также настроен там.

Ответ 5

В классе org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration есть такой код (Spring Boot 1. 5+):

    @Configuration
    @EnableTransactionManagement(proxyTargetClass = false)
    @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false)
    public static class JdkDynamicAutoProxyConfiguration {

    }

    @Configuration
    @EnableTransactionManagement(proxyTargetClass = true)
    @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
    public static class CglibAutoProxyConfiguration {

    }

По умолчанию это spring.aop.proxy-target-class=true, по умолчанию включающий прокси-сервер CGLIB. Если вы хотите использовать прокси-сервер JDK, установите spring.aop.proxy-target-class=false.