多线程向数据库插入数据,的加锁解锁有关问题

多线程向数据库插入数据,的加锁解锁问题
用户在活动添加页面添加一个活动,活动名字叫“拆礼盒”,一个活动可以有多个礼盒,每个礼盒又可以设置奖品数量,保存后我们又要自动生成一个兑奖码,有多少奖品就有多少兑奖码;
问题来了当用户设置奖品数量很大时,比如1000,后台就要循环1000次生成兑奖码然后插入数据库,这个过程是很慢的本人测试,1条条的插,800条需要15秒左右,使用SQLBulkCopy减少大约一半的时间,但是2000条使用SQLBulkCopy也需要1分钟左右时间,用户能等我也不能忍啊!
果断选择多线程,看起来效果不错,页面立刻提示完成,插入兑奖码的过程在后台默默的执行着,但是一查看数据库发现,插入的兑奖码有重复(理论上是不允许重复的),并且数量与用户填写的不一致,不是多了就是少了,多线程嘛,这是正常现象,但是不知道应该在哪里加锁,怎么加锁,有没有大神指点一下啊!
这是第一个方法,循环礼盒数量准备参数
多线程向数据库插入数据,的加锁解锁有关问题
这是第二个方法,也就是后台线程调用的方法,循环奖品数量,生成兑奖码(SN码)使用SQLBulkCopy插入数据库,哪里需要加锁?
多线程向数据库插入数据,的加锁解锁有关问题
------解决思路----------------------
加神马锁啊?!
比如说,开启10个线程,2000条数据,每个线程处理200条,要锁干神马?!
------解决思路----------------------
跟加锁没有关系,你的子线程中不能使用做为foreach循环变量的model变量。你需要在foreach方法内部另外声明一个变量,把model赋值给它,然后在你你的 threadstart 中使用这个局部声明的变量(而不是model)。

另外,这丝毫不会让插入动作变快,相反可能稍慢。只是界面上反映“快”了而已。
------解决思路----------------------
你可以把多条insert拼接成一个sql语句一次性插入
也可以定义个存储过程,把生成的字符串数组传进去,让数据库自己循环插入

也可以先循环生成随机数,放到一个数组里,再用多线程去数组里取值然后插入

不过多线程也不过是让界面看起来不卡而已,后台数据还是都在排队,并不是一股脑的都扔给服务器了