SQL死锁异常

时间:2014-09-01 10:27:13

标签: c# sql

使用C#我编写了一个Windows服务并分离了Windows应用程序

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

现在这个错误发生了很长时间。

  

" CustomSQL执行期间的SQL异常:事务(进程ID 119)   锁定资源与另一个进程陷入僵局并一直存在   被选为死锁受害者。重新运行该交易。 "

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

如何解决错误以准确找到导致此错误的原因?

谢谢

2 个答案:

答案 0 :(得分:0)

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

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 :(得分:0)

您可能需要检查以下几项以减少死锁的可能性:

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