从wait_type入手模拟SQL Server Lock
一、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相关推荐
- php sql 时间 函数,PHP模拟SQL Server的两个日期处理函数
PHP模拟SQL Server的两个日期处理函数 2021-01-21 17:04:27149 //在PHP中处理日期非常不方便,比如求两个日期之间相差的月份?该怎么办呢? //文件名:date.in ...
- SQL Server Lock Escalation - 锁升级
Articles Locking in Microsoft SQL Server (Part 12 – Lock Escalation) http://dba.stackexchange.com/qu ...
- 面试问题:如何模拟SQL Server死锁 (附视频和脚本)
这个视频使用下面的脚本成功地模拟了 SQL Server 的死锁.死锁发生在两个事务在拿到了对方需要的锁的以后,又申请对方已经拿到的锁的条件下.死锁虽然不会造成阻塞 (blocking) 但是会造成 ...
- php$SQL时间函数,PHP模拟SQL Server的两个日期处理函数-PHP教程,PHP应用
//在php中处理日期非常不方便,比如求两个日期之间相差的月份?该怎么办呢? //文件名:date.inc.php3 //在使用这两个函数前,要先将日期或日期时间转换成timestamp类型. //如 ...
- 用于磁盘I / O性能SQL Server监视工具
The goal of this article is to get familiar with SQL Server monitoring tools and identify what some ...
- sql活动监视器 死锁_使用system_health扩展事件监视SQL Server死锁
sql活动监视器 死锁 Performance monitoring is a must to do the task for a DBA. You should ensure that the da ...
- SQL Server 2016 查询存储性能优化小结
SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...
- 数据库SQL Server 2019安装向导的“功能选择”详细说明(微软官方资料)
使用SQL Server 2019安装向导的"功能选择" SQL Server 页上的复选框为您的 SQL Server 安装选择组件. 安装 SQL Server 功能 在 &q ...
- Microsoft SQL Server 2000整合规划
Microsoft SQL Server 2000整合规划 更新日期: 2004年06月24日 SQL Server技术文章 作者:Allan Hirt 投稿人:Tom Davidson和Shaun ...
最新文章
- 教你用R语言分析招聘数据,求职/转行不求人~(附代码、数据集)
- php补充安装扩展支持
- BZOJ3173:[TJOI2013]最长上升子序列(Splay)
- axios 发送 AJAX请求
- 生活中的计算机趣味知识大全,五个有趣的电脑小知识
- 图形化c语言编程,「分享」C语言如何编写图形界面
- 思科命令 service password-encryption
- C Primer Plus怎样高效学?C语言大神案例值得借鉴!
- access_token is invalid or not latest hint
- linux verilog 编译,Verilog 编译指令简介
- 第二章 生成、打包、部署和管理应用程序及类型
- mybatis 插件
- 仿小米商城html网页源码
- Linux chmod、fchmod函数
- 7.2.3 十字链表
- 安卓游戏服务器修改,【httpcather/Thor】课程二,用抓包工具修改微信小游戏,还能保存到服务器...
- 苹果手机如何分享wifi密码_怎样用手机改wifi密码
- Oracle RAC集群增加新共享硬盘并使用AFD的式增加新ASM磁盘组
- 应该记住的10个SQL 查询
- python制作qq登录界面_使用Python编写一个QQ办公版的图形登录界面
热门文章
- 【简讯】ISO确定C++的升级
- 在Java中Vector和ArrayList的区别
- 软件测试的学习之路------软件质量
- cron linux_如何在Linux中使用cron
- u8api openapi_使用OpenAPI规范进行更好的API测试
- 云原生 云计算_使云原生计算具有普遍性和可持续性
- 理论 | 分库分表需要考虑的问题及方案
- Math.signbit()
- 手动抛出异常_(七)异常处理
- java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解