今天收到一个小学弟的求助,数据库插入偶尔重复,怎么在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插入语句的并发问题的更多相关文章

  1. [SQL]开启事物,当两条插入语句有出现错误的时候,没有错误的就插入到表中,错误的语句不影响到正确的插入语句

    begin transaction mustt insert into student values(,'kkk','j大洒扫','j','djhdjh') insert into student v ...

  2. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  3. sqlserver 插入语句

    //--创建事务 Create PROC [dbo].[proc_XXXXX] ) AS BEGIN BEGIN TRAN BEGIN TRY .....................插入 COMM ...

  4. [转]mysqldump备份还原和mysqldump导入导出语句大全详解

    FROM : http://www.cnblogs.com/zeroone/archive/2010/05/11/1732834.html mysqldump备份还原和mysqldump导入导出语句大 ...

  5. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  6. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能

    原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下  我们来分享一下蔡老给我们 ...

  7. Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法

    sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...

  8. Java程序员从笨鸟到菜鸟之(一百零一)sql注入攻击详解(二)sql注入过程详解

    在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于本人数据库和网络方面知识有限,此文章是对网上大量同类文章的分析与总结,其中有不少直接引用 ...

  9. SQL注入攻击[详解]

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...

随机推荐

  1. 国产网络损伤仪SandStorm -- 主界面简介

    国产网络损伤仪SandStorm可以模拟出带宽限制.时延.时延抖动.丢包.乱序.重复报文.误码.拥塞等网络状况,在实验室条件下准确可靠地测试出网络应用在真实网络环境中的性能,以帮助应用程序在上线部署前 ...

  2. C++11特性-右值引用

    什么是左值,什么是右值 常见的误区有 = 左边的是左值,右边的是右值. 左值:具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables) ...

  3. 信号量解决写者优先&读者优先&公平竞争(reader writer)

    先说问题: 这里的rand都是伪随机.解决也很简单,srand即可.内容懒得改了~~ 描述及思路:           代码:           运行结果:   读者优先:           效果 ...

  4. .NET并发编程-数据结构不可变性

    本系列学习在.NET中的并发并行编程模式,实战技巧 内容目录 .NET不可变集合.NET并发集合函数式数据结构设计一个不可变类 作为程序员经常遇到产品上线后出现各种莫名其妙的问题,在我本地是好好的啊, ...

  5. Makefile 流程控制(error,warning)等调试选项

    1.退出码 0 ok1 错误2 使用了-q 选项 且目标不需要更新 返回2 2.选项 -f --file 指定makefile脚本 -n --just-print --dry -run -- reco ...

  6. git commit guidelines

    git-commit-guidelines AngularJS Development Setup Running Tests Coding Rules Commit Message Guidelin ...

  7. TensorFlow & Machine Learning

    TensorFlow & Machine Learning TensorFlow 实战 传统方式 规则 + 数据集 => 答案 无监督学习 机器学习 神经元网络 答案 + 数据集 =&g ...

  8. Principle for iOS App Animation Design

    Principle for iOS App Animation Design Animate Your Ideas, Design Better Apps https://principleforma ...

  9. API 授权 All In One

    API 授权 All In One 身份验证 授权类型 身份验证类型 继承认证 没有认证 API密钥 不记名令牌 基本认证 摘要授权 OAuth 1.0 OAuth 2.0 授权码 隐含的 密码凭证 ...

  10. 新三板 & 挂牌费用

    新三板 & 挂牌费用 关于拟申请公司股票在全国中小企业股份转让系统终止挂牌的提示性公告 https://pilu.tianyancha.com/announcement/ef51e981910 ...