sql server:‘已超过了锁请求超时时段‘ 问题解决方法

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值