一、LCK_M_S,等待获取共享锁

开始一SQL TRAN,其中执行对某数据的UPDATE。但并不COMMIT,也不ROLLBACK。

begin tran
update [dbo].[HR_Employee] set [Description]='ZZ'

这样,便使用排它锁锁定了该[Employee]表。

在另一会话中,执行对该表的SELECT操作。至此,死锁产生。

select * from [dbo].[HR_Employee]

使用下列script查询当前锁情况。

 1 SELECT wt.blocking_session_id                    AS BlockingSessesionId
 2         ,sp.program_name                           AS ProgramName
 3         ,COALESCE(sp.LOGINAME, sp.nt_username)     AS HostName
 4         ,ec1.client_net_address                    AS ClientIpAddress
 5         ,db.name                                   AS DatabaseName
 6         ,wt.wait_type                              AS WaitType
 7         ,ec1.connect_time                          AS BlockingStartTime
 8         ,wt.WAIT_DURATION_MS/1000                  AS WaitDuration
 9         ,ec1.session_id                            AS BlockedSessionId
10         ,h1.TEXT                                   AS BlockedSQLText
11         ,h2.TEXT                                   AS BlockingSQLText
12   FROM sys.dm_tran_locks AS tl
13   INNER JOIN sys.databases db
14     ON db.database_id = tl.resource_database_id
15   INNER JOIN sys.dm_os_waiting_tasks AS wt
16     ON tl.lock_owner_address = wt.resource_address
17   INNER JOIN sys.dm_exec_connections ec1
18     ON ec1.session_id = tl.request_session_id
19   INNER JOIN sys.dm_exec_connections ec2
20     ON ec2.session_id = wt.blocking_session_id
21   LEFT OUTER JOIN master.dbo.sysprocesses sp
22     ON SP.spid = wt.blocking_session_id
23   CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
24   CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2

发现该LOCK的wait_type为LCK_M_S,意味着后一会话在等待着获取对该表的共享锁已完成查询工作。

二、LCK_M_U,等待获取更新锁。

发起一SQL会话,在其中使用更新锁(UPDLOCK)SELECT数据,而后WAIT一定的时间。

1 begin tran
2 select * from [dbo].[HR_Employee] WITH (UPDLOCK) where [Id]=7
3 waitfor delay '00:01:00'
4 update [dbo].[HR_Employee] set [Description]='ZZ' where [Id]=7
5 commit tran

在wait的时间内,[Id]=7的行被更新锁锁住。

发起另一会话,使用更新锁(UPDLOCK)完成SELECT操作。

1 select * from [dbo].[HR_Employee] WITH (UPDLOCK)

发现后一会话被block。wait_type为LCK_M_U,表示其在等待该表的更新锁。

三、LCK_M_X,等待获取排它锁

将上一小节中第二个会话的操作改为UPDATE。

update [dbo].[HR_Employee] set [Description]='ZZy' where [Id]=7

后一会话同样被block,但这次的wait_type为LCK_M_X,表明其在等待用于UPDATE DATA的排它锁。

转载于:https://www.cnblogs.com/isun/p/4280600.html

从wait_type入手模拟SQL Server Lock相关推荐

  1. php sql 时间 函数,PHP模拟SQL Server的两个日期处理函数

    PHP模拟SQL Server的两个日期处理函数 2021-01-21 17:04:27149 //在PHP中处理日期非常不方便,比如求两个日期之间相差的月份?该怎么办呢? //文件名:date.in ...

  2. SQL Server Lock Escalation - 锁升级

    Articles Locking in Microsoft SQL Server (Part 12 – Lock Escalation) http://dba.stackexchange.com/qu ...

  3. 面试问题:如何模拟SQL Server死锁 (附视频和脚本)

    这个视频使用下面的脚本成功地模拟了 SQL Server 的死锁.死锁发生在两个事务在拿到了对方需要的锁的以后,又申请对方已经拿到的锁的条件下.死锁虽然不会造成阻塞 (blocking) 但是会造成 ...

  4. php$SQL时间函数,PHP模拟SQL Server的两个日期处理函数-PHP教程,PHP应用

    //在php中处理日期非常不方便,比如求两个日期之间相差的月份?该怎么办呢? //文件名:date.inc.php3 //在使用这两个函数前,要先将日期或日期时间转换成timestamp类型. //如 ...

  5. 用于磁盘I / O性能SQL Server监视工具

    The goal of this article is to get familiar with SQL Server monitoring tools and identify what some ...

  6. sql活动监视器 死锁_使用system_health扩展事件监视SQL Server死锁

    sql活动监视器 死锁 Performance monitoring is a must to do the task for a DBA. You should ensure that the da ...

  7. SQL Server 2016 查询存储性能优化小结

    SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...

  8. 数据库SQL Server 2019安装向导的“功能选择”详细说明(微软官方资料)

    使用SQL Server 2019安装向导的"功能选择" SQL Server 页上的复选框为您的 SQL Server 安装选择组件. 安装 SQL Server 功能 在 &q ...

  9. Microsoft SQL Server 2000整合规划

    Microsoft SQL Server 2000整合规划 更新日期: 2004年06月24日 SQL Server技术文章 作者:Allan Hirt 投稿人:Tom Davidson和Shaun ...

最新文章

  1. 教你用R语言分析招聘数据,求职/转行不求人~(附代码、数据集)
  2. php补充安装扩展支持
  3. BZOJ3173:[TJOI2013]最长上升子序列(Splay)
  4. axios 发送 AJAX请求
  5. 生活中的计算机趣味知识大全,五个有趣的电脑小知识
  6. 图形化c语言编程,「分享」C语言如何编写图形界面
  7. 思科命令 service password-encryption
  8. C Primer Plus怎样高效学?C语言大神案例值得借鉴!
  9. access_token is invalid or not latest hint
  10. linux verilog 编译,Verilog 编译指令简介
  11. 第二章 生成、打包、部署和管理应用程序及类型
  12. mybatis 插件
  13. 仿小米商城html网页源码
  14. Linux chmod、fchmod函数
  15. 7.2.3 十字链表
  16. 安卓游戏服务器修改,【httpcather/Thor】课程二,用抓包工具修改微信小游戏,还能保存到服务器...
  17. 苹果手机如何分享wifi密码_怎样用手机改wifi密码
  18. Oracle RAC集群增加新共享硬盘并使用AFD的式增加新ASM磁盘组
  19. 应该记住的10个SQL 查询
  20. python制作qq登录界面_使用Python编写一个QQ办公版的图形登录界面

热门文章

  1. 【简讯】ISO确定C++的升级
  2. 在Java中Vector和ArrayList的区别
  3. 软件测试的学习之路------软件质量
  4. cron linux_如何在Linux中使用cron
  5. u8api openapi_使用OpenAPI规范进行更好的API测试
  6. 云原生 云计算_使云原生计算具有普遍性和可持续性
  7. 理论 | 分库分表需要考虑的问题及方案
  8. Math.signbit()
  9. 手动抛出异常_(七)异常处理
  10. java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解