SQL Server中DML语句要申请的锁

对于select语句:

1、当采用表扫描时,会直接锁定page,而不是锁定具体的某条记录,所以会有这些锁:

A、数据库S锁

B、表的IS锁

C、页的S锁

2、当采用索引来查找数据时,会锁定具体的记录,所以会有这些锁:

A、数据库S锁

B、索引中page的IS锁

C、索引中page中的key的S锁

D、表的IS锁

E、页的IS锁

F、RID的S锁

3、对于读过的页面,会加一个IS锁。

对于使用的索引,会对key加上S锁,对索引key所在的页面会加上IS锁。

在查询过程中,会对每一条读到的记录或key加上S锁。

如果记录不是我们要查找的,那么就会释放S锁,如果记录要返回,根据隔离级别,如果是read committed,那么会释放,否则就不会释放。

对于update语句:

1、当采用表扫描时,会直接锁定page,而不是锁定具体的某条记录,所以会有这些锁:

A、数据库S锁

B、表的IX锁

C、页的U锁 或者是X锁,两者的区别在于,由于update语句也是要先找到数据,才能进行修改,所以在查数据时,会对页加上IU锁,然后在继续查看页中的记录时,会先对记录加上U锁,如果发现这条记录,不是需要更新的,那么会立即释放U锁,如果发现这条记录就是要更新的,那么就会加上X锁,然后update这条记录,然后查看下一条记录。

2、当采用索引来查找数据时,会索引具体的记录,所以会有这些锁:

A、数据库S锁

B、索引中page的IU锁

C、索引中page中的key的U锁,也就是不希望别的会话来修改这条记录的key字段,比如现在有2个会话,1个要修改第10条记录的name字段,另一个是要修改第10条记录的key字段,显然,在一个会话修改同一条记录的name字段时,肯定会阻塞住另一个会话修改key字段。也就是说,对同一条记录的不同字段,肯定是不能同时修改的,总是有个先后,否则数据就不一致了。

D、表的IX锁

E、页的IU锁 或者是IX锁,这个区别和上面是一样的,查询时用的是IU锁,当发现这个页内部有需要修改的记录时,会转化为IX锁。

F、RID的X锁

3、对每一个使用的索引,会对key加上U锁,对索引key所在的页面会加上IU锁。

由于update也需要先找到记录,然后才能更新,所以,在扫描过程中,对要扫描的记录所在的页,加上IU锁,对页中的记录加上U锁,如果这些记录要修改,那么会升级为X锁,页面会升级为IX锁。如果这个记录不需要更新,那么会释放U锁,如果整个页面都没有要修改的记录,那么也会释放IU锁。

另外,使用到要修改列的索引越多,那么锁也会越多。比如现在要修改name字段的值,而包含name字段的索引有2个,那么在修改name时,也需要锁定这2个索引的页面和key,所以会先修改表中name字段的值,然后再修改涉及到name字段的2个索引的key值,这个修改操作是先删除,然后再插入key值,比如,要update 3条记录,那么最后修改索引时,会申请6个key 的X锁,3个是要删除的,3个是要插入的。

不过需要特别注意的是,update语句和select 语句的区别在于,update语句获取的锁,直到事务结束,才会释放。

对于Insert 语句:

A、数据库S锁

B、表的IX锁

C、页的IX锁,对于要新插入数据的页,也会有一个IX锁。

D、RID,对要新插入的数据,会申请一个X锁。

E、如果表中有多个索引,那么每个索引上都要插入一条新的数据,要插入数据所在页上,会有一个IX锁。

F、要插入索引中的key,也会有一个X锁。

注意:IS、IU(暂时没发现在表级别上有这个锁)、IX这3个意向锁,都是在表级别、页级别的,而S、U(暂时没没发现在表级别有这个锁)、X 可以在多个级别上。

SQL Server中DML语句要申请的锁

时间: 2024-10-21 19:37:20

SQL Server中DML语句要申请的锁的相关文章

sql server中select语句需要申请的锁

以NA_TrafficMemberOrderRelation表为例,表的索引如下: index_id name cols 1 PK__NA_Traff__FB6751642649A903 TrafficMemberOrderRelationId 26 IX_NA_TrafficMemberOrderRelation_usermobile UserMobile 下面的查询语句,正常情况下会先使用IX_NA_TrafficMemberOrderRelation_usermobile索引进行查找,再返

SQL Server中CURD语句的锁流程分析

我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数据库的锁行为,测试代码未涉及锁升级. 请先参阅: 数据库引擎中的锁定 https://msdn.microsoft.com/zh-cn/library/ms190615.aspx 一.环境:数据库开启“行版本控制的已提交读”,要求单一连接(非单用户模式) http://gf.gamebbs.qq.c

SQL Server中Delete语句表名不能用别名

delete from TABLEA A where A.FIELD1=10        (ORACLE适用)delete TABLEA from TABLEA A where A.FIELD1=10 (SQLSERVER适用)delete  from TABLEA where TABLEA.FIELD1=10    (Ora/SQL均适用)

sql server中的go

1. 作用:向 SQL Server 实用工具发出一批 Transact-SQL 语句结束的信号.2. 语法:一批 Transact-SQL 语句GO如Select 1Select 2Select 3GO3. 说明:1) GO 不是 Transact-SQL 语句:2) 它是 sqlcmd 和 osql 实用工具以及 SQL Server Management Studio 代码编辑器识别的命令.3) SQL Server 应用程序可以将多个 Transact-SQL 语句作为一个批发送到 SQ

SQL Server中常用的SQL语句

1.概述 2.查询概述 3.单表查询 4.连接查询 5.带有exists的相关子查询 6.SQL的集合操作 7.插入操作 8.删除操作 9.修改操作 10.数据定义 11.视图 1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例如:性别(男女),年龄(0-130) 表连接 自然连接:与等值连接(a.id=b.id)相比,连接后的表只有一列id,而不

SQL Server中一些有用的日期sql语句

1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 3.一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 4.季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 5.当天的半夜 SELECT DATEAD

SQL Server中常用的SQL语句(转):

SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例如:性别(男女),年龄(0-130) 表连接 自然连接:与等值连接(a.id=b.id)相比,连接后的表只有一列id,而不是两列

为什么SQL语句Where 1=1 and在SQL Server中不影响性能

    最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响.     虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过程中经常犯得错误就是得出一个很窄的结论,然后教条式的奉若圣经,对于T-SQL领域来说,在网上经常可以看到所谓的优化守则,随便在网上搜了一些摘录如下: 不要有超过5个以上的表连接(JOIN) 考虑使用临时表或表变量存放中间结果 少用子查询 视图嵌套不要过深,一般视图嵌套不要超过2个为宜. 对出现在wh

SQL Server中存储过程 比 直接运行SQL语句慢的原因

问题是存储过程的Parameter sniffing 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete时),可将此复杂操作用