有时我会在不太繁忙的 SQL 服务器上遇到这种异常:
Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Line number: 1
Error Number: 1205
Procedure:
Server name: P01
Error Source: .Net SqlClient Data Provider
Error State: 47
我无法重现它。我尝试同时运行来自不同客户端的多个查询,但它没有显示。 当这种问题发生在过程或触发器内部时,处理此类问题的最佳方法是什么?我的意思是,如何重新运行事务?
当从触发器调用的过程内部发生异常时如何处理,该过程是由某个过程的插入调用的(即: procedure01 -> insert -> trigger -> procedure02 !)
最佳答案
我建议你从两个角度来看待这个问题。
Trap or Catch 死锁错误,以便您可以重新运行被 SQL Server 数据库引擎选为死锁受害者的事务。
找出导致死锁事件的原因。 您可以通过以下两种方式之一执行此操作:运行 SQL Server Profiler Trace 来捕获并记录死锁事件,或者启用某些 SQL Server Trace Flags它将把死锁事件的详细信息记录到 SQL Server 错误日志中。
在绝大多数情况下,您可以确定死锁事件的原因,并通过数据库架构中的结构更改或对涉及/负责的代码进行逻辑更改来补救这种情况死锁事件。
要进一步阅读,请查看:
- How to track down Deadlocks Using SQL Server Profiler
- Minimizing Deadlocks
- Detecting and Ending Deadlocks
希望我已经回答了您的问题,但如果我可以以任何方式进一步帮助您,请告诉我。
关于sql-server - SQL事务死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5389261/