最近在学习【MySQL事务&锁】这块知识,一不留神和MSSQL乱窜了~.~


文章最初是想查看MySQL vs MSSQL在下面环境产生的阻塞现象
会话1开启事务更新数据尚未提交->会话2读取会话1中修改的行->会话3读取会话1中修改的行
MySQL:会话1阻塞会话2,会话1阻塞会话3
MSSQL:会话1阻塞会话2,会话2阻塞会话3
MySQL同学对MSSQL的这种阻塞链表示很不理解!我们查看MSSQL中的锁等待信息,会话2和会话3等待的是同一资源,为什么sys.sysprocesses中显示会话2阻塞会话3呢?
我也不知道,也不想去深挖。还是先把MSSQL中简单SELECT/UPDATE/DELETE操作要申请的锁梳理清楚~
【Microsoft SQL Server企业级平台管理实践】的第9章和第10章详细介绍了阻塞与死锁,建议阅读原文


使用SQL Server Profiler跟踪Lock:Acquired、Lock:Released事件,查看语句执行过程中锁的申请和释放过程
使用sp_lock或者sys.dm_tran_locks罗列连接持有的锁信息
下面的分析基于REPEATABLE READ隔离级别,显式开启事务,执行SELECT/UPDATE操作,且不提交事务
一、堆表
从第一行开始,依次扫描表中的每一行数据,然后检查这一行是不是用户需要的数据,直到最后一行
1.1、SELECT
Profiler跟踪看到的过程如下:
OBJECT申请IS锁->PAGE申请IS锁->RID申请S锁->不是用户所需数据/是用户所需数据->释放当前RID上的S锁/不释放当前RID上的S锁->下一个RID...->下一个PAGE...
注意:扫描过程会对读到的每一条记录加上一个S锁(若记录不返回,在读完这条记录就释放)。只要有任何一条记录上的锁没申请到,查询就会被阻塞
加锁情况(sp_lock):表级别加IS锁;所有PAGE加IS锁;返回行加S锁
1.2、UPDATE
Profiler跟踪看到的过程如下:
OBJECT申请IX锁->PAGE申请IU锁->RID申请U锁->不是用户所需数据/是用户所需数据->释放当前RID上的U锁/PAGE升级成IX锁,RID升级成X锁->下一个RID...->下一个PAGE...
对于UPDATE语句,可简单理解先做查询,把需要修改的记录给找到,然后在这个记录上做修改。找记录的动作要加S锁,找到要修改的记录后会先加U锁,再将U锁升级成X锁
加锁情况(sp_lock):表级别加IX锁;修改行加X锁、修改行所在PAGE加IX锁;其他PAGE加IU
二、非聚集索引
这里是指执行计划使用了非聚集索引
2.1、SELECT
• 返回列在索引中
索引覆盖了请求所包含的列,不需要访问表仅需要访问索引本身
加锁情况(sp_lock):表级别加IS锁;返回行对应索引键值加S锁、返回行对应索引键值所在PAGE加IS锁
• 返回列不在索引中
使用索引键值去访问非聚集索引,然后使用书签访问非聚集索引所在表获取额外的信息
加锁情况(sp_lock):表级别加IS锁;返回行对应索引键值加S锁、返回行对应索引键值所在PAGE加IS锁;返回行加S锁、返回行所在PAGE加IS锁
2.2、UPDATE
• 更新非索引列
加锁情况(sp_lock):表级别加IX锁;修改行加X锁、修改行所在PAGE加IX锁;修改行对应索引键值加U锁、修改行对应索引键值所在PAGE加IU锁
• 更新索引列
加锁情况(sp_lock):表级别加IX锁;修改行加X锁、修改行所在PAGE加IX锁;原索引键值要删除,新索引键值要插入,对应两个KEY加X锁、索引键值所在PAGE加IX锁
三、聚集索引
3.1、SELECT
加锁情况(sp_lock):表级别加IS锁;返回行加S锁;返回行所在PAGE加IS锁
3.2、UPDATE
• 更新非索引列
加锁情况(sp_lock):表级别加IX锁;修改行加X锁;修改行所在PAGE加IX锁
• 更新索引列
加锁情况(sp_lock):表级别加IX锁;修改行原键值要删除,新键值要插入,对应两个KEY加X锁;修改行所在PAGE加IX锁

--隔离级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL READ COMMITTED --PAGE
DBCC IND(AdventureWorks2008R2,'Employee_Demo',-1)
DBCC IND(7,981578535,1)
DBCC TRACEON (3604)
DBCC PAGE(7,1,3792,3) WITH TABLERESULTS
--KeyHashValue
SELECT * FROM Employee_Demo WHERE %%lockres%% ='(a0c936a3c965)' --有没有阻塞发生?是什么时候发生的?在哪个数据库上?
SELECT spid,kpid,blocked,waittime,s.waitresource,dbid,s.last_batch,status FROM sys.sysprocesses s WHERE spid>50
--现在阻塞发生在哪个或哪些资源上
SELECT request_session_id
,resource_type
,request_status
,request_mode
,resource_description
,OBJECT_NAME(p.object_id) AS OBJECT_NAME
,i.name index_name
FROM sys.dm_tran_locks
LEFT JOIN sys.partitions p
ON sys.dm_tran_locks.resource_associated_entity_id = p.hobt_id
LEFT JOIN sys.indexes i
ON p.object_id = i.[object_id]
AND p.index_id = i.index_id
ORDER BY request_session_id,resource_type

MSSQL-SELECT&UPDATE动作要申请的锁的更多相关文章

  1. 从 select ... for update来分析mysql的锁

    一 mysql的悲观锁 - 以行锁做示例 每次拿数据的时候都认为别的线程会修改数据,所以每次拿数据的时候都会给数据上锁.上锁之后,当别的线程想要拿数据时,就会阻塞.直到给数据上锁的线程将事务提交或者回 ...

  2. SQL Server 的各种查询和要申请的锁

    前期准备: 1.建表 create table T_Btree(X int primary key,Y nvarchar(4000));            create table T_Heap( ...

  3. 笔记28 mssql的update :from语法

    原文:笔记28 mssql的update :from语法 笔记28 mssql的update :from语法 --mssql的update :from语法 --a表 b表 结构分别 id ,name ...

  4. mysql 通过测试'for update',深入了解行锁、表锁、索引

    mysql 通过测试'for update',深入了解行锁.表锁.索引 条件 FOR UPDATE 仅适用于InnoDB存储引擎,且必须在事务区块(BEGIN/COMMIT)中才能生效. mysql默 ...

  5. sql server update时,是行锁还是表锁

    https://bbs.csdn.net/topics/120000749 http://www.cnblogs.com/s021368/articles/2148659.html 问题: udpat ...

  6. mssql的update :from语法

    一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表 一.MS    S ...

  7. SQL Server中DML语句要申请的锁

    对于select语句: 1.当採用表扫描时,会直接锁定page,而不是锁定详细的某条记录,所以会有这些锁: A.数据库S锁 B.表的IS锁 C.页的S锁 2.当採用索引来查找数据时,会锁定详细的记录, ...

  8. MSSQL 批量Update

    UPDATE dbo.WX_TWODIMENCODE_INFO SET wti_scan_views=t.count FROM ( SELECT COUNT(*) AS 'count',lci_ere ...

  9. [Hibernate] - Select/Update/Delete/Insert

    Java bean: package com.my.bean; import java.util.Date; public class WorkPack { private String uWorkP ...

随机推荐

  1. [代码]--C#action和func的使用

    以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发 ...

  2. BZOJ1559[JSOI2009]密码——AC自动机+DP+搜索

    题目描述 输入 输出 样例输入 10 2 hello world 样例输出 2 helloworld worldhello 提示 这题算是一个套路题了,多个串求都包含它们的长为L的串的方案数. 显然是 ...

  3. 【dp专题】NOIP真题-DP专题练习

    这里学习一下DP的正确姿势. 也为了ZJOI2019去水一下做一些准备 题解就随便写写啦. 后续还是会有专题练习和综合练习的. P1005 矩阵取数游戏 给出$n \times m$矩阵每次在每一行取 ...

  4. [luogu1447][bzoj2005][NOI2010]能量采集

    题目大意 求出\(\sum_{i=1}^{n} \sum_{i=1}^{m} gcd(i,j)\times 2 -1\). 题解 解法还是非常的巧妙的,我们考虑容斥原理.我们定义\(f[i]\)表示\ ...

  5. Web Performance and Load Test Project错误集

    当我们创建Web Performance and Load Test Project时,经常会遇到下面这些问题: 1. 当点击Add Recording时, 左边的record tree没有出现: 解 ...

  6. 【AGC010D】Decrementing

    Solution 日常博弈论做不出来. 首先,数值全部为1的局面先手必败. 在接下来的过程中,我们只关注那些大于1的数值. 按照官方题解的思路,首先想一个简化版的问题:没有除的操作,其余相同.那么局面 ...

  7. [SHOI2013]发牌 解题报告

    [SHOI2013]发牌 题意 对一个\(1\sim n(n\le 7\times 10^5)\)的环,指标最开始在\(1\),每次删去顺时针往后第\(d_i\)个元素,指标移到下一个位置.要求输出每 ...

  8. 简易版AC自动机

    为什么说是简易版? 因为复杂度大概是\(O(M*\overline N)\),而似乎还有另一种大概是\(O(M+\sum N)\)的. 不过据说比赛不会卡前一种做法,因为模式串一般不会很长. 那么步入 ...

  9. 树莓派使用iperf3测量网络带宽

    这个工具需要两台设备都安装iperf3工具,一台作为服务端,一台作为客户端.客户端通过链接服务端测量吞吐量. 安装iperf3 sudo apt install iperf3 开启服务端 假设在一台I ...

  10. A1096. Consecutive Factors

    Among all the factors of a positive integer N, there may exist several consecutive numbers. For exam ...