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

开玛莎拉吉的皮老板 2014-12-04 06:31:12
用户在活动添加页面添加一个活动,活动名字叫“拆礼盒”,一个活动可以有多个礼盒,每个礼盒又可以设置奖品数量,保存后我们又要自动生成一个兑奖码,有多少奖品就有多少兑奖码;
问题来了当用户设置奖品数量很大时,比如1000,后台就要循环1000次生成兑奖码然后插入数据库,这个过程是很慢的本人测试,1条条的插,800条需要15秒左右,使用SQLBulkCopy减少大约一半的时间,但是2000条使用SQLBulkCopy也需要1分钟左右时间,用户能等我也不能忍啊!
果断选择多线程,看起来效果不错,页面立刻提示完成,插入兑奖码的过程在后台默默的执行着,但是一查看数据库发现,插入的兑奖码有重复(理论上是不允许重复的),并且数量与用户填写的不一致,不是多了就是少了,多线程嘛,这是正常现象,但是不知道应该在哪里加锁,怎么加锁,有没有大神指点一下啊!
这是第一个方法,循环礼盒数量准备参数

这是第二个方法,也就是后台线程调用的方法,循环奖品数量,生成兑奖码(SN码)使用SQLBulkCopy插入数据库,哪里需要加锁?
...全文
1452 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
[quote=引用 5 楼 klf8520 的回复:] 3楼的解法我试了,有效果,数量对了,但是生成的SN码还是有重复的,是不是第二个方法哪个地方也需要改一下?用多线程其实就是为了页面上看上去“快”而已,只要用户等待时间不长就可以,后台执行个1,2分钟也没事,这只是延迟一下没关系。
生成SN又不耗多少时间,你先循环生成不重复的SN,然后开多线程入库不行吗 在不同线程里去执行生成SN,难免会重复 而且把你SN生成的方法放出来,是否本身算法就有问题[/quote] 我知道了,原来的是生成一个SN立刻插入数据库,然后每次再生成就去判断一下是否已经存在数据库中,而现在是先生成,最后统一插入数据库,所以判断的时候就不是去数据库判断了,而是判断刚生成的SN中是否已存在,这样才不会重复。 还有你说的,方法我也试过,组成一个“1111,2222,333”这样的格式的SN去数据库循环插入,也很费时,统一组成DataTable使用SQLBulkCopy拷贝也很费时,使用多线程就是让页面不再等待,这个生成SN的方法在后台默默执行就可以,执行3分钟都没关系
於黾 2014-12-05
  • 打赏
  • 举报
回复
引用 5 楼 klf8520 的回复:
3楼的解法我试了,有效果,数量对了,但是生成的SN码还是有重复的,是不是第二个方法哪个地方也需要改一下?用多线程其实就是为了页面上看上去“快”而已,只要用户等待时间不长就可以,后台执行个1,2分钟也没事,这只是延迟一下没关系。
生成SN又不耗多少时间,你先循环生成不重复的SN,然后开多线程入库不行吗 在不同线程里去执行生成SN,难免会重复 而且把你SN生成的方法放出来,是否本身算法就有问题
  • 打赏
  • 举报
回复
3楼的解法我试了,有效果,数量对了,但是生成的SN码还是有重复的,是不是第二个方法哪个地方也需要改一下?用多线程其实就是为了页面上看上去“快”而已,只要用户等待时间不长就可以,后台执行个1,2分钟也没事,这只是延迟一下没关系。
於黾 2014-12-05
  • 打赏
  • 举报
回复
你可以把多条insert拼接成一个sql语句一次性插入 也可以定义个存储过程,把生成的字符串数组传进去,让数据库自己循环插入 也可以先循环生成随机数,放到一个数组里,再用多线程去数组里取值然后插入 不过多线程也不过是让界面看起来不卡而已,后台数据还是都在排队,并不是一股脑的都扔给服务器了
  • 打赏
  • 举报
回复
跟加锁没有关系,你的子线程中不能使用做为foreach循环变量的model变量。你需要在foreach方法内部另外声明一个变量,把model赋值给它,然后在你你的 threadstart 中使用这个局部声明的变量(而不是model)。 另外,这丝毫不会让插入动作变快,相反可能稍慢。只是界面上反映“快”了而已。
江南小鱼 2014-12-04
  • 打赏
  • 举报
回复
加神马锁啊?! 比如说,开启10个线程,2000条数据,每个线程处理200条,要锁干神马?!
江南小鱼 2014-12-04
  • 打赏
  • 举报
回复
加神马锁啊?! 比如说,开启10个线程,2000条数据,每个线程处理200条,要锁干神马?!

111,079

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧