从sql语句的角度解刨SqlServer插入语句的并发问题

操作一:重现问题出现原因

然后同时(有点间隔也没关系,但隔时间要小)在查询分析器的两个窗口中执行下如下语句:

复制代码
declare @id int
set @id = ( select max(id) from aTable )
while @id < 40000
begin
set @id = @id + 1
insert into aTable ( id ) select @id
set @id = ( select max(id) from aTable )
end
复制代码
这样的目的在于测试当两个用户同时操作同一个表时的重复性操作,模拟多用户同时导入相同的excel数据,

结果:共得到42953条数据,其中2953条重复,当然,这个重复数据跟执行间隔时间有关。

操作二:进行第一步优化,添加事务

sql语句加上事务处理,

然后同时(有点间隔也没关系,但间隔时间要小)在查询分析器的两个窗口中执行下如下语句:

复制代码
begin tran --开启事务

declare @id int
set @id = ( select max(id) from aTable )
while @id < 40000
begin
set @id = @id + 1
insert into aTable ( id ) select @id
set @id = ( select max(id) from aTable )
end

commit tran --提交事务
复制代码
结果:共得到40000条数据,无重复,但是执行时间是没加事务处理时的6倍,时间太久。

操作三:进行第二步优化,添加锁

sql语句加上事务处理和锁机制,

然后同时(有点间隔也没关系,但间隔时间要小)在查询分析器的两个窗口中执行下如下语句:

复制代码
begin tran --开始事务

declare @id INT
set @id = ( select max(id) from aTable )
while @id < 40000
begin
set @id = @id + 1
–添加锁 with(tablock)
insert into aTable with (tablock) ( id ) select @id
set @id = ( select max(id) from aTable )
end

commit tran --提交事务

复制代码
结果:共得到40000条数据,无重复,执行时间快。
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值