在.net程序中,由于业务逻辑相对复杂,接到请求后,先把需要实时得到结果的部分处理完,然后将剩下的任务丢给后台线程(System.Threading.ThreadPool.QueueUserWorkItem)处理,其简化逻辑是如果数据库(Sql Server)中没有记录,就插入,如果存在此条记录就更新其新值即可,但实际执行时发现一个问题:当请求比较频繁的时候,数据库出现了重复数据,经过分析应该是后台同时执行了多次请求,导致所有的请求都执行了插入操作。请问是否有什么好的解决方式?
把插入数据的那类用单例模式,给方法加锁。如果可以忽略数据库错库的话,给表加一个唯一索引
由于是统计,必须保证数据更新的正确性,目前正在测试在.net程序里,将数据插入那块加lock,代码块里只执行一个存储过程,但存储过程比较复杂,耗时较长,不知道效果如何。
看样子是并发造成的,你可以尝试把插入的方法加上锁。
插入之前检查一下相同数据是否已存在
就是这个问题,每次插入之前都会判断,如下:
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
)
@多一块石头: 检查插入的结果,会发现都是同一时间插入的。
dudu老大的豆豆多,就不给你了,哈哈。
英语有点水,代码看懂了,解释没太看懂,哈哈,谢谢各位。已解决,竟然和并发关系不大,代码了关联条件被改了,一直没发现,哈哈。