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中出现死锁,以及简单的解决办法。
以上仅代表个人观点,有不对的地方,欢迎大家指正。 、
相互学习,一起进步。