从sql语句的角度解刨SqlServer插入语句的并发问题
今天收到一个小学弟的求助,数据库插入偶尔重复,怎么在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 创作不易,转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。 |
从sql语句的角度解刨SqlServer插入语句的并发问题的更多相关文章
- [SQL]开启事物,当两条插入语句有出现错误的时候,没有错误的就插入到表中,错误的语句不影响到正确的插入语句
begin transaction mustt insert into student values(,'kkk','j大洒扫','j','djhdjh') insert into student v ...
- mysql中SQL执行过程详解与用于预处理语句的SQL语法
mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...
- sqlserver 插入语句
//--创建事务 Create PROC [dbo].[proc_XXXXX] ) AS BEGIN BEGIN TRAN BEGIN TRY .....................插入 COMM ...
- [转]mysqldump备份还原和mysqldump导入导出语句大全详解
FROM : http://www.cnblogs.com/zeroone/archive/2010/05/11/1732834.html mysqldump备份还原和mysqldump导入导出语句大 ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能
原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba 10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下 我们来分享一下蔡老给我们 ...
- Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法
sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...
- Java程序员从笨鸟到菜鸟之(一百零一)sql注入攻击详解(二)sql注入过程详解
在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于本人数据库和网络方面知识有限,此文章是对网上大量同类文章的分析与总结,其中有不少直接引用 ...
- SQL注入攻击[详解]
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
随机推荐
- 流媒体传输协议之 RTP (上篇)
本系列文章将整理各个流媒体传输协议,包括 RTP/RTCP,RTMP,希望通过深入梳理协议的设计细节,能够给流媒体领域的开发者带来一定的启发. 作者:逸殊 审核:泰一 介绍 RTP,即 real-ti ...
- redis持久化-AOF
1.aof文件写入与同步 2.aof重写 重写的目的是为了减小aof文件的体积,redis服务器可以创建一个新的aof文件来代替现有的aof文件,新文件不会有冗余的命令. BGREWRITEAOF:遍 ...
- Gym 101480I Ice Igloos(思维乱搞)题解
题意:给个最多500 * 500的平面,有半径最多不为1的n个圆,现在给你1e5条线段,问你每条线段和几个圆相交,时限10s 思路: 因为半径<1,那么我其实搜索的范围只要在线段附近就好了.x1 ...
- LaTex公式在线转图片
Reference https://latex.codecogs.com/gif.latex?THE_FORMULAR 注: 请不要包含空格 或者 将整段url放到浏览器里, 会产生空格等字符的替换, ...
- CSS字体大小: em与px、pt、百分比之间的对比
CSS样式最混乱的一个方面是应用程序中文本扩展的font-size属性.在CSS中,你可以用四个不同的单位度量来显示在web浏览器中的文本大小.这四个单位哪一种最适合Web? 这个问题引起了广泛的 ...
- Chrome & console.log & color & js
Chrome & console.log & color & js console.log & color // OK log(`%cchat_list =\n%c${ ...
- Google can't be accessed again, today is shit day
Google can't be accessed again, today is shit day 2019.11.28 12:00~20:56 holy shit (pile of poop) Go ...
- windows 隐藏desktop.ini文件
原文 在文件夹选项>查看 勾选"隐藏受保护的操作系统文件(推荐)"选项
- PAUL ADAMS ARCHITECT :阿联酋和美国富人推动英国高端房地产市场
来自2020年前三季度的数据显示,在英国高端市场上,由国际买家担保的抵押贷款交易数量最多,阿联酋目前处于领先地位.到目前为止,在2020年完成的所有交易中,有35%来自阿联酋. PAUL ADAMS ...
- django学习-17.如何提供一个规范的接口返回值
目录结构 1.前言 2.进行实际的一个完整流程操作 2.1.第一步:编写一个用于查询用户数据的视图函数 2.2.第二步:编写对应的一个url匹配规则 2.3.第三步:启动django项目[hellow ...
