如何解决SQL Server 2008死锁图执行堆栈的完整性如何?
| 当我在sql Server中获得死锁图xml时,它显示了每个进程的执行堆栈,例如(我删除了大多数属性):<process>
<executionStack>
<frame>INSERT INTO MYTABLE</frame>
<frame>INSERT INTO MYTABLE</frame>
</executionStack>
<inputbuf>INSERT INTO MYTABLE</inputbuf>
</process>
我知道框架列表不包含事务中的所有框架,但是它包含与死锁有关的所有框架,所以我不需要进一步检查了吗?还是我还需要在同一事务中检查前面的sql语句,以完整了解死锁的原因?
编辑:进一步说明,如果在两个单独的spid中运行,则以下内容可能会自身死锁:
从mytable中选择*,其中column = @arg
从mytable中删除,其中column = @arg
死锁图会显示select语句还是delete语句,还是仅显示delete语句,因为那是事务中的最后一条语句?也没有看到select语句,就很难确定正确的修复方法(例如,select上的updlock提示)。
解决方法
您需要在同一事务中检查前面的sql语句。
死锁图仅向您显示发生死锁时执行的语句的调用堆栈。实际获取死锁资源的语句可能不存在。这很容易证明如下。
连接1
CREATE TABLE T1
(
id INT PRIMARY KEY,foo CHAR(100),bar CHAR(100)
)
INSERT INTO T1
(id)
VALUES (1),(2)
GO
BEGIN TRAN
UPDATE T1
SET foo = \'123\'
WHERE id = 1
WAITFOR DELAY \'00:00:05\'
GO
UPDATE T1
SET bar = \'dlock\'
WHERE id = 2
ROLLBACK
DROP TABLE T1
连接2(在连接1之后快速执行)
BEGIN TRAN
UPDATE T1
SET foo = \'123\'
WHERE id = 2
WAITFOR DELAY \'00:00:05\'
GO
UPDATE T1
SET bar = \'dlock\'
WHERE id = 1
ROLLBACK
死锁图
<process-list>
<process
id=\"process520d1c8\"
taskpriority=\"0\"
logused=\"504\"
waitresource=\"KEY: 1:72057594051100672 (010086470766)\"
waittime=\"3666\"
ownerId=\"10399789\"
transactionname=\"user_transaction\"
lasttranstarted=\"2011-10-30T13:45:29.030\"
XDES=\"0x4eb5be8\"
lockMode=\"X\"
schedulerid=\"2\"
kpid=\"8656\"
status=\"suspended\"
spid=\"59\"
sbid=\"0\"
ecid=\"0\"
priority=\"0\"
trancount=\"2\"
lastbatchstarted=\"2011-10-30T13:45:34.047\"
lastbatchcompleted=\"2011-10-30T13:45:34.043\"
clientapp=\"Microsoft SQL Server Management Studio - Query\"
hostname=\"MyPC\"
hostpid=\"7544\"
loginname=\"Me\"
isolationlevel=\"read committed (2)\"
xactid=\"10399789\"
currentdb=\"1\"
lockTimeout=\"4294967295\"
clientoption1=\"671090784\"
clientoption2=\"390200\">
<executionStack>
<frame
procname=\"adhoc\"
line=\"2\"
stmtstart=\"58\"
sqlhandle=\"0x02000000b24eb7001f552b64e5c2bf2ccb1f2acfda154410\">
UPDATE [T1] set [bar] = @1 WHERE [id]=@2
</frame>
<frame
procname=\"adhoc\"
line=\"2\"
stmtstart=\"4\"
stmtend=\"90\"
sqlhandle=\"0x020000002688730e96c94af4582dfb097fa79a39ea620d63\">
UPDATE T1 SET bar = \'dlock\' where id=1
</frame>
</executionStack>
<inputbuf>
UPDATE T1 SET bar = \'dlock\' where id=1
rollback
</inputbuf>
</process>
<process
id=\"process370d8718\"
taskpriority=\"0\"
logused=\"504\"
waitresource=\"KEY: 1:72057594051100672 (020068e8b274)\"
waittime=\"5579\"
ownerId=\"10399738\"
transactionname=\"user_transaction\"
lasttranstarted=\"2011-10-30T13:45:27.040\"
XDES=\"0x1ef7ac10\"
lockMode=\"X\"
schedulerid=\"1\"
kpid=\"2060\"
status=\"suspended\"
spid=\"52\"
sbid=\"0\"
ecid=\"0\"
priority=\"0\"
trancount=\"2\"
lastbatchstarted=\"2011-10-30T13:45:32.083\"
lastbatchcompleted=\"2011-10-30T13:45:32.043\"
clientapp=\"Microsoft SQL Server Management Studio - Query\"
hostname=\"MyPC\"
hostpid=\"7544\"
loginname=\"Me\"
isolationlevel=\"read committed (2)\"
xactid=\"10399738\"
currentdb=\"1\"
lockTimeout=\"4294967295\"
clientoption1=\"671098976\"
clientoption2=\"390200\">
<executionStack>
<frame
procname=\"adhoc\"
line=\"3\"
stmtstart=\"58\"
sqlhandle=\"0x02000000b24eb7001f552b64e5c2bf2ccb1f2acfda154410\">
UPDATE [T1] set [bar] = @1 WHERE [id]=@2
</frame>
<frame
procname=\"adhoc\"
line=\"3\"
stmtstart=\"8\"
stmtend=\"94\"
sqlhandle=\"0x020000004a869b267636c00306e481791dec78ade36b3f39\">
UPDATE T1 SET bar = \'dlock\' where id=2
</frame>
</executionStack>
<inputbuf>
UPDATE T1 SET bar = \'dlock\' where id=2
ROLLBACK
DROP TABLE T1
</inputbuf>
</process>
</process-list>
未显示首先获得锁的第4列的分配。
(注:如果不使用“ 5”语句将语句分开进行批处理,在这种情况下,您将看到有问题的语句,但是通常,锁获取可能会在调用堆栈的更下方进行,因此,实际上不会显示实际获取锁的语句)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。