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

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

2025-05-07 20:54:41作者:鲍丁臣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. 配置检查:定期检查数据源配置,确保没有重复代理的情况发生。

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

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

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
202
2.17 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
208
285
pytorchpytorch
Ascend Extension for PyTorch
Python
61
94
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
977
575
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
9
1
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
550
83
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.02 K
399
communitycommunity
本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息
393
27
MateChatMateChat
前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。 官网地址:https://matechat.gitcode.com
1.2 K
133