none
关于死锁的问题 RRS feed

  • 问题

  • 我有一个维护的程序,一直报如下错误:
    事务(进程 ID 86)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

    我有什么办法可以查到是那一句SQL语句在发生这样的死锁,有什么办法可以去看一下嘛
    我用EXEC SP_LOCK
    可以查到一个表,里面有一些表格都没有代替什么呢
    51 4 0 0 DB     S GRANT
    52 7 0 0 DB     S GRANT
    53 7 0 0 DB     S GRANT
    54 7 0 0 DB     S GRANT
    55 7 1810105489 1 PAG 1:183465                         S GRANT
    55 7 1810105489 1 PAG 1:183364                         S GRANT
    55 7 1810105489 1 PAG 1:179310                         S GRANT
    55 7 1810105489 1 PAG 1:179311                         S GRANT
    55 7 1810105489 1 PAG 1:179272                         S GRANT
    55 7 0 0 DB                                  S GRANT
    2010年2月10日 9:53

答案

  • PAG 1:183465                         

    看到这里么,这个表示 数据库id和表对象id

    你这个锁的spid是55


    执行
    dbcc INPUTBUFFER(spid) 查看 执行语句



    family as water
    2010年2月10日 11:49
  • Hi,

    打开trace flag 1222 for SQL Server 2005/2008 or trace flag 1204 fro SQL 2000.这个flag会给出详细的deadlock信息以及涉及的sql statements.

    关于如何解读trace flag的信息,请见下面的链接 (deadlock精华贴 ):

    http://blogs.msdn.com/bartd/archive/2006/09/09/747119.aspx

    http://blogs.msdn.com/bartd/archive/2006/09/13/751343.aspx

    http://blogs.msdn.com/bartd/archive/2006/09/25/770928.aspx
    2010年2月10日 14:49
  • >=2005 的sql 版本, 可以直接使用 sql 事件探查器跟踪发生的死锁

    2010年2月11日 4:30

全部回复