只有一个交易过程中的死锁受害者

时间:2014-10-14 21:50:56

标签: sql-server sql-server-2008-r2

我编写了一个存储过程,它正在一个大型财务数据表的循环中工作。

该过程正在读取包含许多公式的命令表。这些公式被转换为相当复杂的INSERT命令:每个insert命令从文件中读取多行,然后进行数学运算,然后创建一个新行。

这看起来像这样:

"Formula": R411 = R22+R26*R22

insert into tab (RecNr, value) select 411, (select value from tab
where RecNr = 22) + (select value from tab where RecNr = 26)*(select
value from tab where RecNr = 22)

到目前为止,这非常好,但有时,我突然得到DEADLOCK VICTIM错误,程序停止。

正在运行没有正在使用此表的其他进程! 更重要的是,插入的记录在程序中不会再次读取!

我只有两个想法:

  • 可能会在INSERT语句的SELECT部分​​中多次读取EXISTING记录(如我的示例中的Record Nr 22)

  • 另外,我有一个模糊的想法,即SQL服务器可能没有进行" RECORD LOCKING",但有些类型的" PAGE LOCKING"。因此,可能会发生SQL服务器想要插入新记录,但页面被锁定在select语句中的读取操作中。

有关于此的任何想法吗?

2 个答案:

答案 0 :(得分:0)

运行以下查询以从system-health扩展事件会话中获取有关死锁的更多信息。死锁需要多个连接,所以我希望其他活动。

--get deadlock_report from ring_buffer target
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;

答案 1 :(得分:0)

我终于能够通过使用SQL Server探查器创建“死锁图”来追踪问题。您需要在分析器中选择“死锁图”事件,然后等待出现死锁。有关详细信息,请参阅Microsoft MSDN联机文档。