书写一存储过程: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)