首页 新闻 会员 周边 捐助

Sql Server并发带来的数据重复插入问题。

0
悬赏园豆:30 [已解决问题] 解决于 2014-02-24 18:05

在.net程序中,由于业务逻辑相对复杂,接到请求后,先把需要实时得到结果的部分处理完,然后将剩下的任务丢给后台线程(System.Threading.ThreadPool.QueueUserWorkItem)处理,其简化逻辑是如果数据库(Sql Server)中没有记录,就插入,如果存在此条记录就更新其新值即可,但实际执行时发现一个问题:当请求比较频繁的时候,数据库出现了重复数据,经过分析应该是后台同时执行了多次请求,导致所有的请求都执行了插入操作。请问是否有什么好的解决方式?

多一块石头的主页 多一块石头 | 初学一级 | 园豆:131
提问于:2014-02-24 14:23
< >
分享
最佳答案
0

把插入数据的那类用单例模式,给方法加锁。如果可以忽略数据库错库的话,给表加一个唯一索引

收获园豆:10
cenlo | 小虾三级 |园豆:583 | 2014-02-24 15:03

由于是统计,必须保证数据更新的正确性,目前正在测试在.net程序里,将数据插入那块加lock,代码块里只执行一个存储过程,但存储过程比较复杂,耗时较长,不知道效果如何。

多一块石头 | 园豆:131 (初学一级) | 2014-02-24 15:11
其他回答(3)
0

看样子是并发造成的,你可以尝试把插入的方法加上锁。

收获园豆:10
王一一 | 园豆:133 (初学一级) | 2014-02-24 14:33
0

插入之前检查一下相同数据是否已存在

dudu | 园豆:29732 (高人七级) | 2014-02-24 14:41

就是这个问题,每次插入之前都会判断,如下:

insert into table1 (c1,c2,c3,c4,c5)
select c1,c2,c3,c4,c5
from table2
where not exists (
select * from table1
where c1 = table2.c1 and c2 = table2.c2
)

支持(0) 反对(0) 多一块石头 | 园豆:131 (初学一级) | 2014-02-24 14:46

@多一块石头: 检查插入的结果,会发现都是同一时间插入的。

支持(0) 反对(0) 多一块石头 | 园豆:131 (初学一级) | 2014-02-24 14:47

dudu老大的豆豆多,就不给你了,哈哈。

支持(0) 反对(0) 多一块石头 | 园豆:131 (初学一级) | 2014-02-24 18:05
0
收获园豆:10
Launcher | 园豆:45050 (高人七级) | 2014-02-24 15:40

英语有点水,代码看懂了,解释没太看懂,哈哈,谢谢各位。已解决,竟然和并发关系不大,代码了关联条件被改了,一直没发现,哈哈。

支持(0) 反对(0) 多一块石头 | 园豆:131 (初学一级) | 2014-02-24 18:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册