SQL死锁异常

  • 本文关键字:异常 死锁 SQL c# sql
  • 更新时间 :
  • 英文 :


使用C#我编写了一个windows服务和单独的windows应用程序

由于某种原因,我一直收到以下错误。

它很长一段时间都运行良好,现在出现了这个错误。

"CustomSQL执行期间发生SQL异常:事务(进程ID 119)与另一个进程在锁定资源上陷入僵局,并且被选为死锁受害者。重新运行事务。"

我知道其他服务也在访问数据库中的同一个表。他们已经有很长一段时间了,也就是几个月了,从来没有看到过这个错误。

如何对错误进行故障排除,以准确查找导致此错误的原因?

感谢

有很多方法可以解决死锁问题。通常我首先运行以下查询:

Declare @xml xml
Select @xml = CAST(target_data AS XML) 
FROM sys.dm_xe_session_targets st
    Inner Join sys.dm_xe_sessions s ON s.address = st.event_session_address
WHERE [name] = 'system_health'
Select
    XEventData.XEvent.value('@package', 'nvarchar(max)') Package,
    XEventData.XEvent.value('@name', 'varchar(max)') Name,
    XEventData.XEvent.value('@timestamp', 'DateTime') Date,
    XEventData.XEvent.query('(data/value)[1]') Deadlock,
    cast(XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)') as xml),
    XEvent.query('.') --*
From @xml.nodes('//RingBufferTarget/event') as XEventData (XEvent)
WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report';

然后,您可以使用结果来查看死锁的原因。

为了减少死锁的机会,您可能需要检查以下几件事:

  1. 最小化事务大小和事务时间
  2. 在应用程序中,每次访问服务器对象的顺序始终相同
  3. 避免游标、while循环或需要用户输入的进程当它运行时
  4. 减少应用程序中的锁定时间
  5. 如果可能,请使用查询提示来防止锁定(NoLock、RowLock)
  6. 使用SET deadlock_PRIORITY选择死锁牺牲品