首页
/ Seata项目中DataSource代理重复导致主键冲突问题分析与解决

Seata项目中DataSource代理重复导致主键冲突问题分析与解决

2025-05-07 11:56:25作者:鲍丁臣Ursa

问题背景

在使用Seata分布式事务框架时,开发者在纯SpringMVC环境下(未使用SpringBoot)遇到了数据库主键冲突的问题。错误日志显示在尝试获取全局锁时,系统抛出了"Duplicate entry"异常,提示主键重复。

错误现象

从错误日志中可以观察到以下关键信息:

  1. 系统在执行批量获取锁操作时失败
  2. 错误类型为MySQLIntegrityConstraintViolationException
  3. 具体错误信息为"Duplicate entry 'jdbc:mysql://drdsbggaq2b6y9n5.drds.aliyuncs.com/member_pressure^' for key 'PRIMARY'"

问题原因分析

经过深入分析,发现该问题主要由以下原因导致:

  1. DataSource重复代理:系统对数据源进行了多次代理,导致Seata在操作锁表时尝试重复插入相同的记录。

  2. 配置方式不当:开发者同时使用了两种数据源代理方式:

    • 通过@EnableAutoDataSourceProxy注解启用自动代理
    • 又手动创建了DataSourceProxy Bean
  3. 锁表操作机制:Seata在获取全局锁时会先尝试插入锁记录,如果记录已存在则会抛出异常(这是正常行为,后续会有重试机制)

解决方案

针对这个问题,可以采用以下解决方案:

  1. 统一代理方式:只保留一种数据源代理方式,推荐使用手动配置方式,移除@EnableAutoDataSourceProxy注解。

  2. 完善SpringMVC配置:在SpringMVC的配置文件中明确配置Seata数据源代理,确保只创建单一代理。

  3. 检查锁表状态:通过查看server端的lock表,确认是否存在相关的锁记录,帮助排查问题。

配置示例

以下是经过优化的Seata配置示例:

@Configuration
@Slf4j
public class SeataConfiguration {

    @Bean
    public GlobalTransactionScanner globalTransactionScanner() {
        // 初始化全局事务扫描器
        return new GlobalTransactionScanner("your-application-id", "your-tx-service-group");
    }

    @Bean(name = "druidDataSource")
    public DataSource druidDataSource() {
        // 配置原始数据源
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl("your-jdbc-url");
        druidDataSource.setUsername("your-username");
        druidDataSource.setPassword("your-password");
        druidDataSource.setDriverClassName("your-driver-class");
        return druidDataSource;
    }

    @Bean(name = "dataSource")
    @Primary
    public DataSource dataSourceProxy(@Qualifier("druidDataSource") DataSource dataSource) {
        // 创建单一数据源代理
        return new DataSourceProxy(dataSource);
    }
}

最佳实践建议

  1. 环境一致性:确保开发、测试和生产环境使用相同的Seata配置方式。

  2. 日志监控:加强对Seata相关日志的监控,特别是锁操作相关的日志。

  3. 版本管理:保持Seata客户端和服务端版本一致,避免兼容性问题。

  4. 配置检查:定期检查数据源配置,确保没有重复代理的情况发生。

通过以上措施,可以有效避免因数据源重复代理导致的主键冲突问题,保证分布式事务的正常运行。

登录后查看全文
热门项目推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
260
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
854
505
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
254
295
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
331
1.08 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
397
370
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
kernelkernel
deepin linux kernel
C
21
5