SQLSERVER 数据库死锁的分析,排查

说明:以下命令基于SQLSERVER2012 R2版本进行开发测试。

 

 

1.模拟一个表被锁定

 

--开始一个事务
begin tran

--更新一个表
update tb_User set password='' where userid=''

--延迟提交事务,没有提交事务,当前表处于锁定状态
waitfor delay '0:10:00'

commit tran

 

测试截图如下:

 

 

 

2.怎么知道数据库哪些对象被锁定了?

--查询被锁定的系统资源名称
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'

 

可以看到在会话ID为56的进程中,TB_User表被锁定了,测试截图如下:

 

 

 

3.怎么查看该表做了什么操作被锁定,参与执行了什么Sql语句呢?根据上面的spid 我们根据以下脚本进行查询

 

SELECT DEST.TEXT
FROM sys.[dm_exec_connections] SDEC
CROSS APPLY sys.[dm_exec_sql_text](SDEC.[most_recent_sql_handle]) AS DEST
WHERE SDEC.[most_recent_session_id] = 56

 

我们可以看到因为执行了步骤1被锁定的,这样就找到了死锁的原因,测试截图如下:

 

 

4.怎么解决死锁的问题?

如果出现了死锁,我们也找到了问题所在,肯定是看我们执行的脚本是否有问题,并且进行改进。但是如果我们想直接终止该进程,可以使用以下命令:

 

 

 

5.在使用步骤2中的命令,查看被锁定的资源,发现刚才锁定的进程已经释放了,测试截图如下:

 

 

以上就是怎么排查SqlServer中出现死锁,以及简单的解决办法。

以上仅代表个人观点,有不对的地方,欢迎大家指正。 、

相互学习,一起进步。

 

posted @ 2022-03-12 22:21  我是太子殿下  阅读(1977)  评论(0编辑  收藏  举报