sql的锁机制,是时刻贯彻在每一次的sql事务中的,为了理解更透彻,介绍锁之前,我们得先了解,锁是为了干什么!!

1、数据库异常情况  

  1.1 先来聊聊数据可能发生个异常状况

    1)脏读:读未提交,顾名思义,读到了不该读的东西,如:

    

    事务B读到了事务A回滚的数据,就是脏读  

    2)不可重复读:读已提交,同个事务内,多次读取同个数据,却返回不同结果,偏向数据更新

    

    事务B发生了不可重复读

    3) 幻读:同个事务内,因其他事务插入或删除数据,导致读取到不同的数据量(本质和不可重复读相似)

    

    事务B发生了幻读

  1.2 数据库用什么机制来处理这些异常情况的发生,四种隔离级别

    1)读未提交(Read Uncommitted):发生脏读,基本没有数据库使用这个级别了

    2)读已提交(Read Committed):大多数数据库系统的默认隔离级别,解决了脏读问题

    3)可重复读(Repeatable Read):同一事务的多个实例在并发读取数据时,会看到同样的数据,解决了不可重复读问题

    4)可串行化(Serializable):这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。但可能导致大量的超时现象和锁竞争

    总结:四种级别越往后越影响性能,但数据越稳定,实现机制就是"锁";

    

2、都有什么锁

  2.1锁的种类:

    1)共享锁:其他事务可select,无法被update、delete、insert

    2)排他锁:其他事务不可任何操作

  2.2粒度提示:

    1)rowlock:行锁,指定到行,select * from dual where id=1会默认行锁

    2)paglock:页锁,select * from dual会默认页锁,select的时候先锁定第一页,读取后释放,再锁定第二页,直到读完

    3)tablock:表锁,语句结束解锁

    4)tabockx:表锁,排他锁。

    5)nolock:取消默认锁,涉及大量删除数据的时候可能会堵塞进程,如果需要select,可以加上nolock来过滤掉需要删除的数据

    6)holdlock:保持共享锁,数据库会根据sql操作加默认锁

    7)serializable:同holdlock

    8)readcommited:遵循读已提交隔离级别

    9)updlock:更新锁,排他锁

3、举例子

  3.1 模拟场景,多个客户在抢一个优惠券

    客户:kxy

begin tran
declare @_owner varchar(100);
set @_owner = (select owner from Coupons with(updlock) where id=2);
if(@_owner is null or @_owner='')
begin
update Coupons set owner='kxy' where id=2
waitfor delay '00:00:10'
print '恭喜您,抢到了!!'
end;
else
print '该券已经被抢了!!'
commit tran

    客户:keys

begin tran
declare @_owner varchar(100);
set @_owner = (select owner from Coupons with(updlock) where id=2);
if(@_owner is null or @_owner='')
begin
update Coupons set owner='keys' where id=2
waitfor delay '00:00:10'
print '恭喜您,抢到了!!'
end;
else
print '该券已经被抢了!!'
commit tran

    用代码进行抢券,同个时间先后执行kxy和keys抢券

    结果:

      kxy

      

      keys

      

    持续更新,感谢关注!!!

SqlServer 高并发的情况下,如何利用锁保证数据的稳定性的更多相关文章

  1. Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?

    1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...

  2. mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复

    转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql ...

  3. SSD磁盘,CPU居高不下,高并发的情况下,是不是mysql解析器耗费的cpu资源高?

    你看看我做的实验,这个user表是300多W纪录,普通磁盘下,消耗时间最多的是Copy to tmp table 0.81秒,当然在ssd下,这个可以减少很多很多的,第二高就是sending data ...

  4. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  5. 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

    在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VA ...

  6. Sqlserver 高并发和大数据存储方案

    Sqlserver 高并发和大数据存储方案 随着用户的日益递增,日活和峰值的暴涨,数据库处理性能面临着巨大的挑战.下面分享下对实际10万+峰值的平台的数据库优化方案.与大家一起讨论,互相学习提高!   ...

  7. 在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结

    在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结在不格式化原有系统盘的情况下,用grub4dos+firadisk安装WIN7到VHD,内存大的 ...

  8. 双重检查加锁机制(并发insert情况下数据重复插入问题的解决方案)

    双重检查加锁机制(并发insert情况下数据重复插入问题的解决方案) c#中单例模式和双重检查锁 转:https://blog.csdn.net/zhongliangtang/article/deta ...

  9. Java高并发与多线程(四)-----锁

    今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...

  10. 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

随机推荐

  1. 最简单明了的yield from解释

    def one(): print('one start') res = yield from two() print('function get res: ', res) return 'one' + ...

  2. [OC] 统计代码行数

    1.打开终端 2. cd 路径,或者 输入cd ,然后把要统计代码的工程拖入终端,就会出现工程的路径. 然后按下回车. 3.输入: find . -name "*.m" -or - ...

  3. C# 屏蔽词过滤

    参考:https://www.cnblogs.com/kubidemanong/p/10834993.html public class TreeNode { public char Char; pu ...

  4. <二>JMeter/Navicat for MYSQL运行案例

    一.JMeter 1. 下载地址:http://jmeter.apache.org/download_jmeter.cgi 2. 选择适合的版本进行下载,如下: 3. 将下载好的压缩包解压到任意文件夹 ...

  5. node16 以上版本不能安装 node-sass

    最近多次遇到这个问题,node16+版本安装或者初始化带有node-sass和sass-loader包的项目报错. 方法一: 卸载旧版本的node-sass和sass-loader,安装sass和sa ...

  6. element-ui switch

    <el-tooltip :content="'Switch value: ' + value" placement="top"> <el-sw ...

  7. 井字棋判断输赢C

    #include <stdio.h> int main(){ char a[3][3]; for (int i = 0; i < 3; ++i) { for (int j = 0; ...

  8. 图论之最小生成树问题(kruskal)

    最近有几位同学催我更新,于是来摸摸鱼,来讲一下最小生成树问题. 所谓最小生成树(MST),就是在一张无向带权图中的一棵经过所有节点,边权和最小的一棵树.在实际生活中,可以运用于城镇之间的修路上. 对于 ...

  9. 微信小程序 css overflow :hidden 子元素不生效

    原css  .item .right {     width: 70%; }    .item .right .name {     font-size: 32rpx;     font-family ...

  10. 十大经典排序之希尔排序(C++实现)

    希尔排序 思路: 1.选择一个增量序列 t1,t2,--,tk,其中 ti > tj, tk = 1(最后必须是1) 2.按增量序列个数 k,对序列进行 k 趟排序 代码实现: #include ...