发布网友 发布时间:2022-04-09 07:33
共1个回答
热心网友 时间:2022-04-09 09:02
根据2中提供的sql,查看那个spid处于wait状态,然后用kill spid来干掉。当然这只是一种临时解决方案,我们总不能在遇到死锁就在用户的生产环境上排查死锁,Kill sp,我们应该考虑如何去避免死锁。
使用SET LOCK_TIMEOUT timeout_period(单位为毫秒)来设定锁请求超时。默认情况下,数据库没有超时期限timeout_period值为-1,可以用SELECT @@LOCK_TIMEOUT来查看该值,即无限期等待。当请求锁超过timeout_period时,将返回错误。
timeout_period值为0时表示根本不等待,一遇到锁就返回消息。设置锁请求超时,破环了死锁的第二个必要条件(请求与保持条件)。
服务器: 消息1222,级别16,状态50,行1已超过了锁请求超时时段。
SQL Server内部有一个锁监视器线程执行死锁检查,锁监视器对特定线程启动死锁搜索时,会标识线程正在等待的资源;然后查找特定资源的所有者,并递归地继续执行对那些线程的死锁搜索,直到找到一个构成死锁条件的循环。检测到死锁后,数据库引擎 选择运行回滚开销最小的事务的会话作为死锁牺牲品,返回1205 错误,回滚死锁牺牲品的事务并释放该事务持有的所有锁,使其他线程的事务可以请求资源并继续运行。