首页 新闻 会员 周边 捐助

数据库不能使用并行插入操作插入行?

0
悬赏园豆:10 [已解决问题] 解决于 2013-08-01 11:28
不能使用并行插入操作插入行
 
公司erp导入数据客户端软件,在解析完报表数据后,为了提高数据入库效率,程序参用线程池进行并发插入操作插入记录,数据入库时程序会出现未响应,cpu占用为0问题分析:

 
业务逻辑:开了10个线程,执行select查询是否存在记录,不存在就执行insert插入记录。
问题分析:查询msdn,"INSERT 语句总是在其修改的表上获取排他 (X) 锁并在事务完成之前持有该锁。 使用排他锁时,任何其他事务都无法修改数据;仅在使用 NOLOCK 提示或未提交读隔离级别时才会进行读取操作。"
当线程a执行insert操作时,获取排他锁,其实操作系统切换线程给线程b,线程b首先请求获取排他锁,此时就符合发生死锁的条件:循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。
 
不知道分析的对不?
21天后的主页 21天后 | 初学一级 | 园豆:3
提问于:2012-11-03 11:55
< >
分享
最佳答案
0

由于插入动作要检查关键字是否重复,不可以并行操作的。

收获园豆:10
marco hsu | 初学一级 |园豆:141 | 2012-11-03 13:01
其他回答(2)
0

数据库并发插入,因为主键的原因,做Insert会自动会加上排他锁,所以多线程并发,那是徒劳的,应该把N条数据放在一个结果集里执行写入,比如把要写入数据的主键提取出来,做一个charindex检索判断,有的就删除,然后一并写入,类似传入SQL一个LIST结果集,而不是一条条的写。传入有两种方式,一个是XML字符串解析成表,二是传入自定义表类型,这样就是一条SQL语句,写入的结果集有多大,就能同时写入多少条!

班级中队长 | 园豆:94 (初学一级) | 2012-11-16 10:39
0

Thread.Sleep(5);//触发操作系统立刻重新进行一次CPU竞争

21天后 | 园豆:3 (初学一级) | 2013-08-01 11:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册