分析及解决SQLServer死锁问题

369994469

369994469

2016-01-29 15:45

分析及解决SQLServer死锁问题,分析及解决SQLServer死锁问题
死锁,简而言之,两个或者多个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, @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
   上述sql创建一个deadlock的示范数据库,插入了1000条数据,并在表t1上建立了c1列的聚集索引,和c2列的非聚集索引。另外创建了两个sp,分别是从t1中select数据和update数据。
   好,打开一个新的查询窗口,我们开始执行下面的query:
   -- Batch #2
   USE deadlocktest
   SET NOCOUNT ON
   WHILE (1=1) EXEC p2 4
   GO
   开始执行后,然后我们打开第三个查询窗口,执行下面的query:
   -- Batch #3
   USE deadlocktest
   SET NOCOUNT ON
   CREATE TABLE #t1 (c2 int, c3 int)
   GO
   WHILE (1=1) BEGIN
             INSERT INTO #t1 EXEC p1 4
             TRUNCATE TABLE #t1
展开更多 50%)
分享

猜你喜欢

分析及解决SQLServer死锁问题

SQLServer
分析及解决SQLServer死锁问题

SQL Server死锁的分析

SQLServer
SQL Server死锁的分析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

巧用MySQL InnoDB引擎锁机制解决死锁问题

编程语言 网络编程
巧用MySQL InnoDB引擎锁机制解决死锁问题

从问题入手帮你解决Oracle杀死死锁进程

编程语言 网络编程
从问题入手帮你解决Oracle杀死死锁进程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java 编程技术中汉字问题的分析及解决

编程语言 网络编程
Java 编程技术中汉字问题的分析及解决

常见PHP页面漏洞分析及相关问题解决

PHP
常见PHP页面漏洞分析及相关问题解决

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

PS教程从零开始学后期!后期课堂之色彩之美

PS教程从零开始学后期!后期课堂之色彩之美

SQL Server对文件进行全文检索的查询

SQL Server对文件进行全文检索的查询
下拉加载更多内容 ↓