【问题标题】:SQL deadlocked exceptionSQL死锁异常
【发布时间】:2014-09-01 10:27:12
【问题描述】:

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

由于某种原因,我不断收到以下错误。

运行了很长时间,现在出现这个错误。

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

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

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

谢谢

【问题讨论】:

  • 您的其他语句是否有一个他们忘记提交/回滚的悬空事务?
  • 设置一个记录死锁的数据库分析器 - 然后你可以看到哪些进程发生冲突,然后调试回你的代码
  • 确保如果有多个 proc/statement 访问同一个表,则它们以相同的顺序连接。此外,如果您不太担心在另一个语句中更改数据,您可以在连接中使用“with nolock”。正如艾伦所说,我知道捕捉它的唯一方法是使用分析器,但如果它不经常发生,它可能不会捕捉到它!

标签: c# sql


【解决方案1】:

有很多方法可以解决死锁问题。通常我从运行这个查询开始:

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';

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

【讨论】:

  • 错误:无效的对象名称“sys.dm_xe_session_targets”。
  • @CaughtInALoop 什么版本的sql server?这应该适用于 sql server 2008 R2 及更高版本。
  • 啊,它在 sql server 2008 中的版本 2005 错误:无效的对象名称 'sys.dm_xe_session_targets'。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多