-- =====================================================
-- 如何使用跟踪标记 1204
--
-- 邹建 2005.08(引用请保留此信息)
-- =====================================================
-- =====================================================
/*-- 说明
跟踪标记 1204 用于返回参与死锁的锁的类型以及当前受影响的命令。死锁信息将自动发送到错误日志。
开启跟踪标记使用 dbcc traceon ,第3个参数指定为-1,表示不单单针对当前connection,而是针对所有包括未来建立的connection
关闭跟踪标记使用 dbcc traceoff
下面是在查询分析器中使用跟踪标记 1204 的演示, 死锁的信息被记录在 sql server 日志中,可以通过下面的方法查看:
企业管理器 -- 展开实例 -- 管理 -- sql server 日志
由于在企业管理器中查看时, 部分日志信息会被截断, 所以所以建议使用记事本一类的文本查看工具直接查看 /mssql/log 目录下的 errorlog 文件
有关死锁信息的详细说明参考联机帮助(联机丛书--菜单中的go--url--输入下面的地址:
mk:@msitstore:c:/program%20files/microsoft%20sql%20server/80/tools/books/trblsql.chm::/tr_servdatabse_5xrn.htm
--*/
-- =====================================================
-- 测试环境
use tempdb
go
create table ta(id int)
insert ta select 1
create table tb(id int)
insert tb select 1
go
-- 开启死锁记录
dbcc traceon(1204,3605,-1)
go
-- 产生死锁 (打一个新连接, 复制此段代码并且执行)
set lock_timeout -1
set deadlock_priority low
set transaction isolation level
repeatable read
begin tran
select * from ta where id=1
waitfor delay '00:05:00'
update tb set id=2 where id=1
commit tran
go
-- 关闭死锁记录
dbcc traceoff(1204,3605)
go
-- 清除测试
drop table ta,tb
go
-- 1204 产生的日志记录信息
2005-08-25 08:16:21.85 spid4 node:1
2005-08-25 08:16:21.85 spid4 rid: 2:1:28:0 cleancnt:2 mode: u flags: 0x2
2005-08-25 08:16:21.85 spid4 grant list 0::
2005-08-25 08:16:21.85 spid4 owner:0x1998aec0 mode: s flg:0x0 ref:1 life:02000000 spid:52 ecid:0
2005-08-25 08:16:21.85 spid4 spid: 52 ecid: 0 statement type: update line #: 1
2005-08-25 08:16:21.85 spid4 input buf: language event: set lock_timeout -1
set transaction isolation level
repeatable read
begin tran
select * from tb where id=1
waitfor delay '00:01:00'
update ta set id=2 where id=1
commit tran
2005-08-25 08:16:21.85 spid4 requested by:
2005-08-25 08:16:21.85 spid4 restype:lockowner stype:'or' mode: x spid:51 ecid:0 ec:(0x19b5b558) value:0x1997b2c0 cost:(1/0)
2005-08-25 08:16:21.85 spid4 node:2
2005-08-25 08:16:21.85 spid4 rid: 2:1:15:0 cleancnt:2 mode: u flags: 0x2
2005-08-25 08:16:21.85 spid4 grant list 0::
2005-08-25 08:16:21.85 spid4 owner:0x1997b3e0 mode: s flg:0x0 ref:1 life:02000000 spid:51 ecid:0
2005-08-25 08:16:21.85 spid4 spid: 51 ecid: 0 statement type: update line #: 1
2005-08-25 08:16:21.85 spid4 input buf: language event:
set lock_timeout -1
set deadlock_priority low
set transaction isolation level
repeatable read
begin tran
select * from ta where id=1
waitfor delay '00:01:00'
update tb set id=2 where id=1
commit tran
2005-08-25 08:16:21.85 spid4 requested by:
2005-08-25 08:16:21.85 spid4 restype:lockowner stype:'or' mode: x spid:52 ecid:0 ec:(0x1a24d558) value:0x1998cfa0 cost:(0/0)
2005-08-25 08:16:21.85 spid4 victim resource owner:
2005-08-25 08:16:21.85 spid4 restype:lockowner stype:'or' mode: x spid:51 ecid:0 ec:(0x19b5b558) value:0x1997b2c0 cost:(1/0)
-- 分析日志记录信息, 以分析 node:1 为例, --** 标注的是说明
--** node:x 在死锁的链中表示项目号 (x)。
2005-08-25 08:16:21.85 spid4 node:1
2005-08-25 08:16:21.85 spid4 rid: 2:1:28:0 cleancnt:2 mode: u flags: 0x2
--** lists, 可以是授权(grant)、转换(convert)和等待(wait),grant list列举当前授权的所有者.
2005-08-25 08:16:21.85 spid4 grant list 0::
2005-08-25 08:16:21.85 spid4 owner:0x1998aec0 mode: s flg:0x0 ref:1 life:02000000 spid:52 ecid:0
--** 在并行进程情况下,标识系统进程 id 线程。条目 spid x ecid 0 表示主线程,而 spid x ecid > 0 表示同一 spid 的子线程。
--** statement type: 语句类型
--** line #:死锁发生时,正在执行的语句的行号
2005-08-25 08:16:21.85 spid4 spid: 52 ecid: 0 statement type: update line #: 1
--** input buf 列出当前批处理中所有的语句。
2005-08-25 08:16:21.85 spid4 input buf: language event:
set lock_timeout -1
set transaction isolation level
repeatable read
begin tran
select * from tb where id=1
waitfor delay '00:01:00'
update ta set id=2 where id=1
commit tran
2005-08-25 08:16:21.85 spid4 requested by:
--** mode 为线程请求、授权或等待的特定资源,指定锁的类型。模式可以是 is(意向共享)、s(共享)、u(更新)、ix(意向独占)、six(与意向独占共享)和 x(独占)
2005-08-25 08:16:21.85 spid4 restype:lockowner stype:'or' mode: x spid:51 ecid:0 ec:(0x19b5b558) value:0x1997b2c0 cost:(1/0)
新闻热点
疑难解答