如何快速发现和处理sqlserver数据库的死锁

分类: oracle |
前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉。本文表锁住了的解决方法。 其实不光是上面描述的情况会锁住表,还有很多种场景会使表放生死锁,解锁其实很简单,下面用一个示例来讲解: 1 首先创建一个测试用的表:
CREATE TABLE Test ( TID INT IDENTITY(1,1) )
2 执行下面的SQL语句将此表锁住:
SELECT * FROM Test WITH (TABLOCKX)
3 通过下面的语句可以查看当前库中有哪些表是发生死锁的:
SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName FROM sys.dm_tran_locks WHERE resource_type='OBJECT '
4 上面语句执行结果如下:
http://blog.fwhyy.com/wp-content/uploads/2011/08/2011-08-06_203648.png
- spid :被锁进程ID。
- tableName:发生死锁的表名。
5 只需要使用kill关键字来杀掉被锁的进程ID就可以对表进行解锁:
KILL 52
SQL Server死锁的分析、处理与预防
1、基本原理
https://images0.cnblogs.com/i/554322/201403/161807255437528.x-png
2、一个例子
https://images0.cnblogs.com/i/554322/201403/161810378242685.x-png
https://images0.cnblogs.com/i/554322/201403/161810466219663.x-png
3、检测与排查
3.1 通过Profile工具看死锁
https://images0.cnblogs.com/i/554322/201403/161811314651729.x-png
3.2 通过系统存储过程看死锁
https://images0.cnblogs.com/i/554322/201403/161813148715639.x-png
https://images0.cnblogs.com/i/554322/201403/161814051992230.x-png
SELECT OBJECT_NAME(421666738) AS LockedResource,DB_NAME(11) AS DBName; -------------------------------------------------------------- LockedResource DBName -------------------------------------------------------------- tb_TE_SizeInformation JYBGDB
DBCC INPUTBUFFER(54); --------------------------------------------------------------------------- EventInfo EventType Parameters --------------------------------------------------------------------------- --根据事务的原子性实现个必要条件中 Language Event 0 --请求和等待 BEGIN TRAN --update语句在数据行上加排他锁 --和其它所有锁不兼容 --实现个必要条件中的:互斥 UPDATE tb_TE_BrandInformation SET IsCompensate=0 UPDATE tb_TE_SizeInformation SET [Description]=''
4、处理方式
4.1 SQL Server自动处理
服务器: |
4.2 Kill会话
Kill |
4.3 设定锁请求超时
SET
LOCK_TIMEOUT |
服务器: 消息 1222,级别 16,状态 50,行 1 已超过了锁请求超时时段。 |
4.4 修改程序
4.5 升级硬件
5、如何预防
https://images0.cnblogs.com/i/554322/201403/161831187463276.x-png
SELECT * FROM TABLE1 WITH(NOLOCK); SELECT * FROM TABLE2 WITH(NOLOCK); |
6、结束语