SQL 有时遇到已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
这个错误,刷新以后,右击某张表或者库,发现里面的表全部消失了 或者查询不到。
这是因为 sql进程死锁,资源被抢占,要解决这个问题,得杀死关闭 死锁的进程,下面介绍解决方案:
杀死进程的前提是找到 那个死锁的进程 ,
SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM sys.dm_os_waiting_tasks
这句sql就可以查询到当前阻塞进程的ID
下面只要杀死这些进程就可以了
kill spid(进程ID) 或者 exec(‘kill’ ‘spid’)
这样就可以了 重新刷新下 库 一切正常了
顺便介绍下相关内容的另外两个sql:
–查询当前活动的锁管理器资源的信息
SELECT resource_type '资源类型',request_mode '请求模式',request_type '请求类型',request_status '请求状态',request_session_id '会话ID' FROM sys.dm_tran_locks
–查询数据库进程(where 筛选库)
select spId from master..SysProcesses
where db_Name(dbID) = 'text' and spId <> @@SpId and dbID <> 0
表现一:
一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续这就死锁了。
解决方法:
这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法
仔细分析你程序的逻辑:
1:尽量避免同时锁定两个资源
2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.
表现二:
用户A读一条纪录,然后修改该条纪录。这是用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。
解决方法:
让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock
语法如下:
select * from table1 with(updlock) where ....
https://www.cnblogs.com/firstdream/p/4624595.html
查询死锁表
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
死锁相关信息查询
exec sp_who2 spid
查询自下午以来
SELECT cntr_value AS NumOfDeadLocks
FROM sys.dm_os_performance_counters
WHERE object_name = 'SQLServer:Locks'
AND counter_name = 'Number of Deadlocks/sec'
AND instance_name = '_Total'
- 查看此进程执行的SQL 是哪个,查找问题原因
dbcc inputbuffer(spid) - 查看隔离级别
DBCC USEROPTIONS