@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
также настроен там.
Ответ 4
@EnableTransactionManagement
по умолчанию, см.: https://github.com/jkubrynski/spring-boot/commit/9d219ef7a004c58a88bbbef82a520a22961c9402
Ответ 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
.