我编写了一个存储过程,它正在一个大型财务数据表的循环中工作。
该过程正在读取包含许多公式的命令表。这些公式被转换为相当复杂的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语句中的读取操作中。
有关于此的任何想法吗?
答案 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联机文档。