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

从sql语句的角度解刨SqlServer插入语句的并发问题今天收到一个小学弟的求助 数据库插入偶尔重复 怎么在 sql 语句上进行解决 Q 学长 我导入 excel 数据的操作 平时使用好好的 怎么突然发生插入重复的问题 A 你是使用哪个 ORM 框架进行操作的 Q 什么是 ORM 框架

大家好,我是讯享网,很高兴认识大家。

今天收到一个小学弟的求助,数据库插入偶尔重复,怎么在sql语句上进行解决。

Q:学长,我导入excel数据的操作,平时使用好好的,怎么突然发生插入重复的问题?

A:你是使用哪个ORM框架进行操作的?

Q:什么是ORM框架?

A:额……,你数据库怎么链接操作的?

Q:我使用Connection对象进行链接操作的。

A:哦,ADO.NET呀,你把导入数据的插入sql语句的截图发出来看看。


Q:sql截图(这里就不展示了,就是一个简单的insert into,如:INSERT INTO aTable(id) VALUES(“1”))

A:哦哦,你语句没有并发情况下没问题,但是多人同时导入数据就存在并发,数据重复意料之中。


Q:啊,这还涉及到并发?那我怎么修改呀

A:简单,不改变其他操作的情况下,你把插入语句加事务加锁机制既可以了。


Q:额……不怎么懂,有demo吗?

A:没事,我就在你的sql语句上优化下,你直接粘贴就可以了。


我们来解刨一下这个问题,现在很多人依赖ORM,都没怎么写sql了,我们就从sql的角度解析一下这个问题。

这里不好提供代码展示,我们这里就简单进行一个模拟还原使用场景。

创建一个表,命名为aTable,里面就一个字段id,int类型,然后插入一个数据为1;


讯享网

在这里插入图片描述

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

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

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条数据,无重复,执行时间快。

这样就从sql上简单解决并发问题啦,当然,还有其他问题和解决方法,

这里就不做叙说了,具体情况遇到再分析,拜拜。

欢迎关注订阅我的微信公众平台【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐
公众号:熊泽有话说
出处: https://www.cnblogs.com/xiongze520/p/14524707.html
创作不易,转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。
在这里插入图片描述

小讯
上一篇 2025-03-23 20:02
下一篇 2025-03-20 11:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/119496.html