当前位置:  开发笔记 > 数据库 > 正文

Sql Server 2008中的死锁疑难解答

如何解决《SqlServer2008中的死锁疑难解答》经验,为你挑选了2个好方法。

我的网站似乎没有处理大量的访问者,我相信这是因为服务器太简单了.

2小时前我的网站获得了大量的点击,我发现发生了3次死锁错误,错误是:

System.Data.SqlClient.SqlException:事务(进程ID 58)在锁资源上与另一个进程死锁,并被选为死锁牺牲品.重新运行该交易.

我不确定为什么会发生这种情况......看看堆栈跟踪,我可以看到这发生在选择查询中.

任何人都知道这个错误可能是什么原因?

服务器正在运行Windows 2008和Sql Server 2008.



1> Raghu A..:

SQL Server 2008有多种方法可以识别死锁中涉及的进程和查询.

    如果死锁很容易重现,频率更高,您可以分析SQL服务器(启用分析器时,您在服务器上具有访问和性能成本),使用SQL Profiler将为您提供漂亮的死锁图形视图.此页面包含使用死锁图表所需的所有信息 http://sqlmag.com/database-performance-tuning/gathering-deadlock-information-deadlock-graph

    大多数情况下复制死锁很困难,或者它们发生在生产环境中,我们不希望将Profiler连接到它并影响性能.

我会使用此查询来发生死锁:

SELECT
  xed.value('@timestamp', 'datetime') as Creation_Date,
  xed.query('.') AS Extend_Event
FROM
(
  SELECT CAST([target_data] AS XML) AS Target_Data
  FROM sys.dm_xe_session_targets AS xt
  INNER JOIN sys.dm_xe_sessions AS xs
  ON xs.address = xt.event_session_address
  WHERE xs.name = N'system_health'
  AND xt.target_name = N'ring_buffer'
) AS XML_Data
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed)
ORDER BY Creation_Date DESC

我不会朝着使用(NOLOCK)修复死锁的方向前进.那是滑坡,隐藏了原来的问题.



2> Neil Barnwel..:

除非您启用了行版本控制,否则写入将阻止对SQL Server的读取.您应该使用sp_who2存储过程和SQL事件探查器跟踪. sp_who2将告诉你哪些进程阻塞哪些进程,并且探查器将告诉你阻塞进程的最后一个语句是什么.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有