SqlServer需要在执行操作前对目标资源获取所有权,那么久发生锁定,是一个逻辑概念。为了保证事务的ACID特性设计的一种机制。

在多用户并发操作数据时,为了出现不一致的数据,锁定是必须的机制。使用锁可保证数据一致性,但这也致使你在编码、设计时要把锁定考虑进去。如果锁的数量太多,持续时间过长,对并发和系统性能都没有好处。

在SQL Server支持的隔离级别中,级别越高,严格性也就越高,这就增加了阻塞甚至死锁的机会。

锁资源:行、页、或者表(如果有分区、可能还有分区锁)

锁模式:共享锁、排他锁、更新锁、意向锁、

锁的所有权:锁的范围。绝大部分锁的范围是事务范围的

锁定的元数据:使用sys.dm_tran_locks这个DMV解锁。

SQLServer可以在用户数据的行(RID/KEY锁)、页(PAGE锁)或者表(OBJECT锁)级别上锁定资源。SQLServer会尽可能申请行级锁、以便获取最高的并发度。

SQL Server锁住一个索引上的行时,在sys.dm_tran_locks中会显示Key;如果是锁住了堆表上的数据行,则会显示RID,如果堆上有非聚集索引,实际上是锁住了整个索引行,而不仅仅是索引键。当会话运行在SERIALIZABLE隔离级别下,还可能会锁住索引行的一个范围

根据不同的隔离级别,可以支持两种Key锁,如果事务的隔离级别为READ COMMITTED/REPEATABLE READ,会锁住查询需要的索引行,如果数据表上有聚集索引,实际的数据行在叶子节点中,显示KEY锁,如果表为堆表,SQL Serer会把锁加到非聚集索引中,也叫KEY锁,或者加在堆的数据行上,叫RID锁

隔离级别为SERIALIZABLE,为了避免幻读,SQL Server 会锁住一个范围,如果所查询的是范围值,那么需要锁住足够的部分,确保另外一个事务不会在这个事务扫描的过程中插入值,这种说在DMV中显示key-range锁。

幻读:如果事务A中有两个相同的查询,而且带有了限定词(如WHERE条件)在第一次查询之后,会锁住查询所需的数据范围,而事务B这时插入了一行满足WHERE条件的数据,在第一次查询中没有这条数据,没有锁住,插入是成功的,当事务A进行第二次查询时,就会出现这条新数据,于是就出现了幻读。

SQLServer锁的基础问题探究的更多相关文章

  1. sqlserver锁表、解锁、查看锁表

    sqlserver锁表.解锁.查看锁表 http://www.cnblogs.com/zfanlong1314/p/3698566.html http://www.cnblogs.com/chjf20 ...

  2. SQLserver锁和事务隔离级别的比较与使用(转)

    SQLserver锁和事务隔离级别的比较与使用(转) http://www.cnblogs.com/chenlulouis/archive/2010/12/06/1898014.html http:/ ...

  3. SQLServer锁的机制

    SQLServer锁的机制:共享锁(S)排它锁(X)更新锁(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架构修改(Sch-M) 架构稳定性(Sch-S)大容量更新(BU)

  4. SQLServer锁的概述

    SQLServer锁的概述   锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了 ...

  5. 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  6. sqlserver锁表、解锁、查看销表 (转载)

    sqlserver中怎么锁表.解锁.查看销表呢,下面我以三个不同的实例给各位朋友详细介绍一下有需要的朋友可参考一下. 更多详细内容请查看:http://www.111cn.net/database/O ...

  7. SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

    Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   ...

  8. 掌握SQLServer锁的相关概念

    一.为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: ◆丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ◆脏读 ...

  9. HIT Software Construction Lab6引发出来对锁的问题的探究

    前言 做完lab5开始做lab6了鸭,哈工大计算机学院的学生永不停歇.在做lab6的时候,我在想移动猴子是锁一整个ladder(ADT)还是只锁一个ladder的一个域Monkey数组呢?这两个好像差 ...

随机推荐

  1. xadmin后台页面定制和添加服务器监控组件

    xadmin定制 项目需要添加服务器监控页面,碍于xadmin不是很好自定义页面,之前写过插件,太麻烦了,还是直接改源码 原理其实很简单,因为xadmin的处理流程和django类似,都是通过拦截UR ...

  2. 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值

    如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1.  输入 单价,数量,计算金额 ...

  3. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  4. liunx 安装Zabbix的心酸历程

    作者:邓聪聪 为了工作之需要,在系统服务方面不断的摸爬打滚,有了这样点点滴滴的经验,留后在使用!  插件网盘取. 链接: https://pan.baidu.com/s/1i5u0ed3 密码: rx ...

  5. TextArea 保存时换行符处理

    后台数据保存时就要处理“\r\n",替换成”<br />",前台(html)页面显示时再做下处理. 自己是mvc页面,用到了两个方法:Html.Raw(),以及Http ...

  6. centos7 docker使用https_proxy 代理配置

    centos7 docker使用https_proxy 代理配置 背景: 内网的centos主机不能上网,通过同网段的windows设置代理上网,yum.conf配置http代理是可以的,但是dock ...

  7. 【原创】大数据基础之Logstash(2)应用之mysql-kafka

    应用一:mysql数据增量同步到kafka 1 准备mysql测试表 mysql> create table test_sync(id int not null auto_increment, ...

  8. UpdatePanel1里面使用FileUpload控件

    最近做项目过程中,遇到了UpdatePanel1里面放了一个FileUpload控件,结果从后台就获取不到上传的文件了,找了好久才找到原因.原因: 加了红色部分后立马获取到了.

  9. 二进制补码除法——计算机底层整数除法模拟之Java实现

    前面讲到布思算法的计算机底层模拟的时候,我们是借助于一个可以储存.表示任意N位的二进制补码的BinaryQueue实现的,现在我们模拟计算机底层整数除法还是要借助于它: BinaryQueue类代码: ...

  10. CSS margin属性取值

    margin表示一个元素的外边距.取值为正值时,表示相对于正常流离邻近元素更远,而取负值时,使其更近 但是,设置margin后,四个方向的表现形式不同 自身发生移动:top.left margin-t ...