Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQLServer2008中的死锁故障排除_Sql Server 2008_Deadlock - Fatal编程技术网

Sql server 2008 SQLServer2008中的死锁故障排除

Sql server 2008 SQLServer2008中的死锁故障排除,sql-server-2008,deadlock,Sql Server 2008,Deadlock,我的网站似乎不能处理大量的访问者,我相信这是因为服务器太简单了 2小时前,我的网站点击率很高,我注意到出现了3个死锁错误,错误是: System.Data.SqlClient.SqlException : 事务(进程ID 58)在另一个进程的锁资源上被死锁,并被选为死锁牺牲品。重新运行事务 我不知道为什么会这样。。。查看堆栈跟踪,我可以看到这是在select查询中发生的 有人知道这个错误的原因吗 服务器正在运行Windows 2008和Sql server 2008。写操作将阻止Sql ser

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

2小时前,我的网站点击率很高,我注意到出现了3个死锁错误,错误是:

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

我不知道为什么会这样。。。查看堆栈跟踪,我可以看到这是在select查询中发生的

有人知道这个错误的原因吗


服务器正在运行Windows 2008和Sql server 2008。

写操作将阻止Sql server上的读取,除非已启用行版本控制。您应该使用存储过程和SQL探查器跟踪
sp_who2
将告诉您哪些进程正在阻止哪些进程,探查器将告诉您阻止进程的最后一条语句。

如果您不介意脏读,可以尝试在SELECT查询中的表名后面加上(NOLOCK)。这里需要权衡的是,由于当前执行的UPDATE和INSERT语句被忽略,因此不能保证您获得最新的数据

通常情况下,这并不是什么了不起的事情,因为大多数系统的读取量远远大于它们的更新/插入量,但这显然取决于应用程序的性质


另外,请看一看

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

  • 如果死锁很容易重现,频率会更高,并且您可以使用SQL profiler分析SQL server(启用探查器时,您可以在服务器上进行访问并降低性能成本),这将为您提供良好的死锁图形视图。 此页面包含使用死锁图所需的所有信息

  • 大多数情况下,复制死锁是很困难的,或者死锁发生在我们不希望将探查器附加到死锁上并影响性能的生产环境中

  • 我将使用此查询来获取发生的死锁:

    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)来修复死锁。这是一个滑坡,隐藏了最初的问题

    编辑这里有一个指向SQLServerProfiler文档的更新链接,尽管上面链接中的理论仍然适用。Nolock,没有准确理解“不能保证最新数据”的后果是一个非常糟糕的主意。我强烈建议不要使用Nolock。我意识到这是一篇老文章,但我觉得我需要向任何偶然发现这篇文章的人(就像我一样)提供一个警告,以寻求帮助解决僵局。我亲眼目睹了诺洛克的罪恶所描述的后果——它们很难清理。不要让NOLOCK成为团队中的一种习惯。有人可能会说,由于SQLServer2000的锁定模型不够健壮,所以NOLOCK在SQLServer2000中是必要的,但从SQLServer2005开始,几乎不需要它。查看上的ALTER DATABASE mydatabase SET READ_COMMITED_快照。您的sqlmag链接已断开。您可能希望链接另一个页面,说明如何获取死锁图。您是否有文档链接,说明如何读取您提供的查询?