SqlServer 高并发的情况下,如何利用锁保证数据的稳定性
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 高并发的情况下,如何利用锁保证数据的稳定性的更多相关文章
- Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?
1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...
- mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复
转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql ...
- SSD磁盘,CPU居高不下,高并发的情况下,是不是mysql解析器耗费的cpu资源高?
你看看我做的实验,这个user表是300多W纪录,普通磁盘下,消耗时间最多的是Copy to tmp table 0.81秒,当然在ssd下,这个可以减少很多很多的,第二高就是sending data ...
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?
在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VA ...
- Sqlserver 高并发和大数据存储方案
Sqlserver 高并发和大数据存储方案 随着用户的日益递增,日活和峰值的暴涨,数据库处理性能面临着巨大的挑战.下面分享下对实际10万+峰值的平台的数据库优化方案.与大家一起讨论,互相学习提高! ...
- 在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结
在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结在不格式化原有系统盘的情况下,用grub4dos+firadisk安装WIN7到VHD,内存大的 ...
- 双重检查加锁机制(并发insert情况下数据重复插入问题的解决方案)
双重检查加锁机制(并发insert情况下数据重复插入问题的解决方案) c#中单例模式和双重检查锁 转:https://blog.csdn.net/zhongliangtang/article/deta ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
随机推荐
- Python面向对象编程——一些类定义(杂)
一.abstractmethod 子类必须全部实现重写父类的abstractmethod方法 非abstractmethod方法可以不实现重写 带abstractmethod方法的类不能实例化 fro ...
- Luogu P3368 【模板】树状数组 2 [区间修改-单点查询]
P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表 ...
- vue后台管理系统——登录/退出功能
电商后台管理系统的功能--登录/退出功能 1. 登录业务流程 ① 在登录页面输入用户名和密码 ② 调用后台接口进行验证 ③ 通过验证之后,根据后台的响应状态跳转到项目主页 2. 登录业务的相关技术点 ...
- nkIO方法
import java.util.*; public class Main{ public static void main(String args[]){ Scanner sc = new Scan ...
- iOS设置textView的placeholder
转载:http://blog.sina.com.cn/s/blog_7a1b23430102wkys.html #import "ViewController.h" @interf ...
- NPM镜像代理设置
用户目录C:\Users\xxx下建立.npmrc文件,内容如下: registry="https://registry.npm.taobao.org" ELECTRON_MIRR ...
- pyechart画图(1)安装和基本操作
安装 pip install pyecharts==0.1.9.4 https://blog.csdn.net/weixin_43735353/article/details/89328048 Lin ...
- mongodb---docker
docker pull mongo docker run --name mongodb -p 27017:27017 -v /mydata/mongodb/data:/data/db -d mongo ...
- 1,权限问题:无法创建目录"**": 权限不够":
1,权限问题:无法创建目录"**": 权限不够": 解决:在命令前加上 sudo 命令后,输入密码即可 原创建目录命令:mkdir [选项] DirName 解决权限问题 ...
- 黑马 java.lang.IllegalArgumentException: Property ‘dataSource‘ is required
现象: 按照教程步骤做的,但连单元测试都无法通过,会出现java.lang.IllegalArgumentException: Property 'dataSource' is required这个错 ...