多线程调用存储过程问题

在处理千万级数据时,多线程调用SQL Server的存储过程proc_importurltodb出现重复数据问题。为解决此问题,尝试了三种方案:数据库锁定(但导致表级锁定影响其他事务)、多线程同步(实现复杂)和唯一约束+错误处理(通过创建唯一约束并捕获错误信息)。最终,通过唯一约束成功防止了数据重复插入,但也浪费了700多万次操作。
摘要由CSDN通过智能技术生成

 

        书写一存储过程:proc_importurltodb;

        该存储过程的主要作用是将给定的URL拆分,以类链表的方式多个表分层次给予存储。

        主要的流程为: 首先查询表,判断要插入的数据是否存在;如果存在,则返回相应的orderid;如果不存在,则插入数据,并且返回插入后的orderid。

 

 

        由于数据量较大(千万级),因此程序中采用了ADO+多线程调用存储过程的方式,结果跑了一天的数据发现出现问题了;

由于多线程问题,可能会出现线程1插入同样数据,与此同时线程2插入同样数据,但由于库中没有要插入的数据,因此线程1和线程2会分别将数据给予插入,结果为同样的数据却出现了重复。。。。

 

 

      呵呵,每天都例行公事,出点棘手的问题。没办法只能解决处理了:

 

      方法一:数据库锁定

 

       由于是多线程调用存储过程,而整个插入逻辑都由存储过程实现,因此如果需要锁定数据,仅能靠存储过程中实现。

通过查看sql server 帮助手册以及试验,发现采用

 

     begin tran

 

     SET @OrderNum = (SELECT  top 1 urldomainorderid FROM UrlDomainTable with(tablockx)   WHERE urlinfo = @UrlDomain)

 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值