16

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

2 小时前,我的网站获得了很多点击,我注意到发生了 3 个死锁错误,错误是:

System.Data.SqlClient.SqlException :事务(进程 ID 58)在锁定资源上与另一个进程死锁,并已被选为死锁受害者。重新运行事务。

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

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

服务器运行的是 Windows 2008 和 Sql Server 2008。

4

3 回答 3

13

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

  1. 如果死锁很容易重现,频率更高,并且您可以使用 SQL Profiler 对 SQL 服务器进行分析(启用分析器后,您会在服务器上获得访问和性能成本),这将为您提供很好的死锁图形视图。此页面包含使用死锁图所需的所有信息 http://sqlmag.com/database-performance-tuning/gathering-deadlock-information-deadlock-graph

  2. 大多数情况下,重现死锁很困难,或者它们发生在我们不想将 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) 来修复死锁。那是滑坡,隐藏了最初的问题。

于 2014-01-29T17:17:46.467 回答
7

写入将阻止 SQL Server 上的读取,除非您启用了行版本控制。您应该使用sp_who2存储过程和 SQL Profiler 跟踪。 sp_who2会告诉你哪些进程阻塞了哪个进程,分析器会告诉你阻塞进程的最后一条语句是什么。

于 2009-04-06T07:47:25.030 回答
-4

如果您不介意脏读,您可以尝试在 SELECT 查询中将 (NOLOCK) 放在表名之后。这里的权衡是,您不能保证最新数据,因为当前执行的 UPDATE 和 INSERT 语句被忽略。

通常这并没有太大的影响,因为大多数系统读取的内容远远超过更新/插入的内容,但显然这取决于您的应用程序的性质。

或者看看http://www.sql-server-performance.com/tips/deadlocks_p1.aspx

于 2009-04-06T09:13:23.077 回答