SQL Server死锁

时间:2015-10-21 05:52:06

标签: sql sql-server deadlock

在我的生产服务器中,我一直面临死锁问题。我已经通过了许多链接,但我无法找到解决方案。

请找到跟踪

$sql = "UPDATE members SET fixed = '".$value."' WHERE username='".$_SESSION['uid']."'";
mysql_query($sql);

更新InterfaceTable是一个视图。在更新时我正在更新INTERFACE_TABLE表。

INTERFACE_TABLE表具有主键SSID

请帮我避免死锁。提前谢谢。

1 个答案:

答案 0 :(得分:1)

顺便说一句:

https://www.mssqltips.com/sqlservertip/2130/finding-sql-server-deadlocks-using-trace-flag-1222/

你可以在那里看到两个spid(81,123)

81是受害者。它正在运行:

 UPDATE dbo.InterfaceTable SET ERRORMESSAGE = @P1 , ACK_DATE = @P2  WHERE (SSID = @P3 )

它是从hostname = 10.9.52.12,loginname = prod

运行的

123是赢家,它正在运行:

Delete from INTERFACE_TABLE
where ( ERRORMESSAGE is null  or  ERRORMESSAGE 
like '%AGREEMENT NOT FOUND.;%'  
or  ERRORMESSAGE like '%UNI:REALLOCATED%')
and ACK_DATE is not null
and ACKID is not null and SSID in(
     select SSID from INTERFACE_TABLE_2015 with(Nolock) 
)     

来自hostname = APP01 hostpid = 2972​​, SQL代理作业中的loginname = APP01 \ sqlsupport。

有几种方法可以解决这个问题:

  1. 了解这两件事正在做什么并改变过程。在我看来,第一个是更新单个错误日志行的客户端应用程序,第二个是清理日志的SQL代理作业。您可以设置SQL代理清理作业的死锁优先级,以便 it 将失败而不是应用程序日志(这是您想要的)

  2. 长期交易会助长僵局。添加索引或优化查询(为什么每次都与INTERFACE_TABLE_2015进行比较?)所以它们不需要这么长时间

  3. 更改您的数据库以使用SNAPSHOT ISOLATION并神奇地解决许多死锁问题

  4. 有更多阅读这些经验的人可以推断完全这里发生的事情,但这是一个开始。

相关问题