事务 ( 进程 ID 60) 与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行 该事务。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事务 ( 进程 ID 60) 与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行 该事务。相关的知识,希望对你有一定的参考价值。

我现有有一个表,很多客户端会同时访问这张表,包括select ,insert,update 这三个操作都会执行很频繁,然后软件运行时有时会出现这个问题,该怎么解决啊

    根据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 错误,回滚死锁牺牲品的事务并释放该事务持有的所有锁,使其他线程的事务可以请求资源并继续运行。




参考技术A 资源相互无限期请求导致资源死锁嘛,一个如果你的数据允许脏读,就在select时加with(nolock)提示
然后仔细检查调用到死锁表的那些业务逻辑,尽量让数据处理顺序进行,这可以避免或减少死锁
参考技术B 资源相互无限期请求导致资源死锁嘛,一个如果你的数据允许脏读,就在select时加with(nolock)提示
然后仔细检查调用到死锁表的那些业务逻辑,尽量让数据处理顺序进行,这可以避免或减少死锁追问

nolock也加了,但是还是有这个问题,insert 和 select 和update 操作很频繁的,特别是insert 和 select,不知道怎么解决啊

追答

nolock只能减少不能根除,你还是照我说的捋顺一下你的业务,把数据操作尽量按同一顺序来执行
或者你研究研究死锁的产生,就明白该从哪里下手了

本回答被提问者和网友采纳

以上是关于事务 ( 进程 ID 60) 与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行 该事务。的主要内容,如果未能解决你的问题,请参考以下文章

SqlException 事务(进程 ID 159)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

事务(进程 ID 64)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。

sqlserver之事务(进程 ID 70)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

并发错误:事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品

SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。

事务(进程 ID 120)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务