微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server 2008死锁图执行堆栈的完整性如何?

如何解决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 举报,一经查实,本站将立刻删除。