您的位置:首页 > 数据库

执行事务时,如果顺序不一样,会导致sql锁死

2015-09-06 10:15 183 查看
如何使用跟踪标记 1204

-- =====================================================

-- 如何使用跟踪标记 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

-- 产生死锁 (查询窗口A)

SET LOCK_TIMEOUT -1

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

-- 产生死锁 (查询窗口B)

SET LOCK_TIMEOUT -1

SET DEADLOCK_PRIORITY LOW

SET TRANSACTION ISOLATION LEVEL

REPEATABLE READ

BEGIN TRAN

SELECT * FROM tb WHERE id=1

UPDATE ta SET id=2 WHERE id=1

COMMIT TRAN

GO

-- 关闭死锁记录

DBCC TRACEOFF(1204,3605)

GO

-- 清除测试

DROP TABLE ta,tb

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: