是否所有死锁都是由错误的查询引起的

Rob*_*son 9 sql-server deadlock

"事务(进程ID 63)在锁定通信缓冲区资源上与另一个进程陷入僵局,并被选为死锁牺牲品.重新运行该事务." 可能的失败原因:查询问题,"ResultSet"属性设置不正确,参数设置不正确或连接未正确建立.

这个死锁可能是由存储过程使用的东西引起的,比如SQL邮件吗?或者它总是导致我的两个应用程序同时访问同一个表?

Ran*_*der 8

同时访问同一个表的两个表一直在应用程序中发生.通常这不会导致死锁.当您说进程'A'尝试更新表1然后再更新表2然后表3时,通常会发生死锁,并且您有进程'B'尝试更新表3,然后是表2,然后是表1.进程' '将'资源锁定,进程'B'需要,进程'B'有资源进程'A'需要.SQL Server将此检测为死锁,并将其中一个进程作为失败的事务回滚.

底线是你有两个进程试图同时更新相同的表,但不是以相同的顺序.这通常会导致死锁.

在您的应用程序中处理此问题的一种简单方法是处理失败的事务并简单地重新执行事务.它几乎总能成功执行.更好的解决方案是确保您的流程尽可能以相同的顺序更新表.