seata-spring-boot-start 1.3.0升级1.4.2全局事务失效解决
2023-04-18 14:04:41 时间
版本
io.seata:seata-spring-boot-starter 1.3.0 升级1.4.2
现象
全局事务失效
解决
方案1. 添加注解@EnableAutoDataSourceProxy 方案2. 通过代码而非自动配置Datasource
原因
1.3.0中seata自动配置数据源代理没有检查是否存在Datasource bean 1.4.2中seata数据源自动配置需要检查存在datasource bean,如果datasource通过springboot自动配置机制注册,不能保证datasource在seata数据源自动配置之前完成配置。
源码
1.3.0
package io.seata.spring.boot.autoconfigure.SeataAutoConfiguration
@ComponentScan(basePackages = "io.seata.spring.boot.autoconfigure.properties")
@ConditionalOnProperty(prefix = StarterConstants.SEATA_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
@Configuration
@EnableConfigurationProperties({SeataProperties.class})
public class SeataAutoConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(SeataAutoConfiguration.class);
@Bean(BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER)
@ConditionalOnMissingBean(name = {BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER})
public SpringApplicationContextProvider springApplicationContextProvider() {
return new SpringApplicationContextProvider();
}
@Bean(BEAN_NAME_FAILURE_HANDLER)
@ConditionalOnMissingBean(FailureHandler.class)
public FailureHandler failureHandler() {
return new DefaultFailureHandlerImpl();
}
@Bean
@DependsOn({BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER, BEAN_NAME_FAILURE_HANDLER})
@ConditionalOnMissingBean(GlobalTransactionScanner.class)
public GlobalTransactionScanner globalTransactionScanner(SeataProperties seataProperties, FailureHandler failureHandler) {
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Automatically configure Seata");
}
return new GlobalTransactionScanner(seataProperties.getApplicationId(), seataProperties.getTxServiceGroup(), failureHandler);
}
@Bean(BEAN_NAME_SEATA_AUTO_DATA_SOURCE_PROXY_CREATOR)
@ConditionalOnProperty(prefix = StarterConstants.SEATA_PREFIX, name = {"enableAutoDataSourceProxy", "enable-auto-data-source-proxy"}, havingValue = "true", matchIfMissing = true)
@ConditionalOnMissingBean(SeataAutoDataSourceProxyCreator.class)
public SeataAutoDataSourceProxyCreator seataAutoDataSourceProxyCreator(SeataProperties seataProperties) {
return new SeataAutoDataSourceProxyCreator(seataProperties.isUseJdkProxy(),seataProperties.getExcludesForAutoProxying());
}
}
1.4.2
io.seata.spring.boot.autoconfigure.SeataDataSourceAutoConfiguration
@ConditionalOnBean(DataSource.class)
@ConditionalOnExpression("${seata.enable:true} && ${seata.enableAutoDataSourceProxy:true} && ${seata.enable-auto-data-source-proxy:true}")
public class SeataDataSourceAutoConfiguration {
/**
* The bean seataDataSourceBeanPostProcessor.
*/
@Bean(BEAN_NAME_SEATA_DATA_SOURCE_BEAN_POST_PROCESSOR)
@ConditionalOnMissingBean(SeataDataSourceBeanPostProcessor.class)
public SeataDataSourceBeanPostProcessor seataDataSourceBeanPostProcessor(SeataProperties seataProperties) {
return new SeataDataSourceBeanPostProcessor(seataProperties.getExcludesForAutoProxying(), seataProperties.getDataSourceProxyMode());
}
/**
* The bean seataAutoDataSourceProxyCreator.
*/
@Bean(BEAN_NAME_SEATA_AUTO_DATA_SOURCE_PROXY_CREATOR)
@ConditionalOnMissingBean(SeataAutoDataSourceProxyCreator.class)
public SeataAutoDataSourceProxyCreator seataAutoDataSourceProxyCreator(SeataProperties seataProperties) {
return new SeataAutoDataSourceProxyCreator(seataProperties.isUseJdkProxy(),
seataProperties.getExcludesForAutoProxying(), seataProperties.getDataSourceProxyMode());
}
}
相关文章
- python tornado如何更改代码?
- 【Win 10 应用开发】三维变换
- 【Win 10 应用开发】透视效果
- 【Win 10 应用开发】加载外部的 srt 字幕
- 【Win 10 应用开发】分析 URI 中的查询字符串
- C++读取UTF-8及GBK系列的文本方法及原理
- 简单的DC-4靶机渗透实战
- 【Win 10 应用开发】TCP通信过程
- STL源码解析--vector
- 【Win 10 应用开发】文件读写的三种方案
- C++指针详解
- 【Win 10 应用开发】在后台进行多媒体转码
- 【Win 10 应用开发】多媒体转码
- 【Win 10 应用开发】获取本机的IP地址
- 算法题:切木头
- 实施固定资产管理系统对企业有什么好处?
- 【Win 10应用开发】响应系统回退键的导航事件
- 编写Windows服务疑问2:探索服务与安装器的关系
- 机器人相关学术速递[11.24]
- OpenCV + OpenVINO实现人脸AR – 请戴上口罩