编程之家 52php.cn 死锁,简而言之,两个或者多个trans,同时请求对方正在请求的某个对象,导致双方互相等待。简单的例子如下: trans1 trans2 ------------------------------------------------------------------------ 1.IDBConnection.BeginTransaction 1.IDBConnection.BeginTransaction 2.update table A 2.update table B 3.update table B 3.update table A 4.IDBConnection.Commit 4.IDBConnection.Commit 那么,很容易看到,如果trans1和trans2,分别到达了step3,那么trans1会请求对于B的X锁,trans2会请求对于A的X锁,而二者的锁在step2上已经被对方分别持有了。由于得不到锁,后面的Commit无法执行,这样双方开始死锁。
好,我们看一个简单的例子,来解释一下,应该如何解决死锁问题。 -- Batch #1 CREATE DATABASE deadlocktest GO USE deadlocktest SET NOCOUNT ON DBCC TRACEON (1222,-1) -- 在SQL2005中,增加了一个新的dbcc参数,就是1222,原来在2000下,我们知道,可以执行dbcc --traceon(1204,3605,-1)看到所有的死锁信息。SqlServer 2005中,对于1204进行了增强,这就是1222。 GO
IF OBJECT_ID ('t1') IS NOT NULL DROP TABLE t1 IF OBJECT_ID ('p1') IS NOT NULL DROP PROC p1 IF OBJECT_ID ('p2') IS NOT NULL DROP PROC p2 GO
CREATE TABLE t1 (c1 int,c2 int,c3 int,c4 char(5000)) GO
DECLARE @x int SET @x = 1 WHILE (@x <= 1000) BEGIN INSERT INTO t1 VALUES (@x*2,@x*2,@x*2) SET @x = @x + 1 END GO
CREATE CLUSTERED INDEX cidx ON t1 (c1) CREATE NONCLUSTERED INDEX idx1 ON t1 (c2) GO
CREATE PROC p1 @p1 int AS SELECT c2,c3 FROM t1 WHERE c2 BETWEEN @p1 AND @p1+1 GO
CREATE PROC p2 @p1 int AS UPDATE t1 SET c2 = c2+1 WHERE c1 = @p1 UPDATE t1 SET c2 = c2-1 WHERE c1 = @p1 GO
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|