就下载 —— 安全下载、无毒手机软件、绿色软件官方下载网站最近更新|下载排行|热门标签|收藏本站

您现在的位置是:就下载 > IT资讯 > 软件教程 > SQL死锁分析并处理

SQL死锁分析并处理

时间:2014-10-17 09:54:36 来源: 复制分享

--死
/******************************************************************************************************************************************************
死指以上事相互阻塞相互等待方放它的,sql server通回其中一事返回一自已解阻塞,其他事完成它的工作。

******************************************************************************************************************************************************/

set nocount on ;
if object_id('T1') is not null
drop table T1
go
create table T1(ID int primary key,Col1 int,Col2 nvarchar(20))
insert T1 select 1,101,'A'
insert T1 select 2,102,'B'
insert T1 select 3,103,'C'
go

if object_id('T2') is not null
drop table T2
go
create table T2(ID int primary key,Col1 int,Col2 nvarchar(20))
insert T2 select 1,201,'X'
insert T2 select 2,202,'Y'
insert T2 select 3,203,'Z'


go
生成表:
/*
T1:
ID Col1 Col2
----------- ----------- --------------------
1 101 A
2 101 B
3 101 C

T2:
ID Col1 Col2
----------- ----------- --------------------
1 201 X
2 201 Y
3 201 Z
*/

防止死:
1、 最少化阻塞。阻塞越少,生死越少
2、 在事中按序表(以上例子:死2)
3、 在理程式中查1205在生重新提交事
4、 在理程式中加一程的入日
5、 索引的合理使用(以上例子:死1、死3)
生死,事自提交,可通日死


死1(索引):
--接窗口1
--1步:
begin tran
update t1 set col2=col2+'A' where col1=101

--3步:
select * from t2 where col1=201
commit tran


--接窗口2

--2步:
begin tran
update t2 set col2=col2+'B' where col1=203

--4步:
select * from t1 where col1=103
commit tran

 

--接窗口1:收到死,接窗口2得到果:

/*
息 1205, 13, 51,行 3
交易 (理序 53) 在 定 源上被另一理序死已被作死的牲者。重新行交易。
*/

--接窗口2:得到果

/*
----------- ----------- --------------------
3 103 C
*/

理方法:
--在t1、t2表的col1件列建索引
create index IX_t1_col1 on t1(col1)
create index IX_t2_col1 on t2(col1)
go

--接窗口1
--1步:
begin tran
update t1 set col2=col2+'A' where col1=101

--3步:
select * from t2 with(index=IX_t2_col1)where col1=201 --因表少,只能指定索引提示才能保SQL Server使用索引
commit tran

 

--接窗口2

--2步:
begin tran
update t2 set col2=col2+'B' where col1=203


--4步:
select * from t1 with(index=IX_t1_col1) where col1=103 --因表少,只能指定索引提示才能保SQL Server使用索引
commit tran

 

--接窗口1:
/*
ID Col1 Col2
----------- ----------- --------------------
1 201 X

(1 料列受到影)

*/
--接窗口2
/*
ID Col1 Col2
----------- ----------- --------------------
3 103 C

(1 料列受到影)
*/


死2(表序):

--接窗口1:
--1步:
begin tran
update t1 set col1=col1+1 where ID=1

--3步:
select col1 from t2 where ID=1
commit tran

 

--接窗口2:
--2步:
begin tran
update t2 set col1=col1+1 where ID=1

--4步
select col1 from t1 where ID=1
commit tran


--接窗口1:

/*
col1
-----------
201

(1 料列受到影)
*/

--接窗口2:

/*
col1
-----------
息 1205, 13, 51,行 1
交易 (理序 54) 在 定 源上被另一理序死已被作死的牲者。重新行交易。
*/

理方法:

--改表的序

--接窗口1:
--1步:
begin tran
update t1 set col1=col1+1 where ID=1

--3步:
select col1 from t2 where ID=1
commit tran

--接窗口2:
--2步:
begin tran
select col1 from t1 where ID=1--等待接窗口1提交
--4步
update t2 set col1=col1+1 where ID=1
commit tran

死3(表):

--接窗口1:

while 1=1
update T1 set col1=203-col1 where ID=2

--接窗口2:
declare @i nvarchar(20)
while 1=1
set @i=(select col2 from T1 with(index=IX_t1_col1)where Col1=102);--因表少,只能指定索引提示才能保SQL Server使用索引

--接窗口1
/*
息 1205, 13, 51,行 4
交易 (理序 53) 在 定 源上被另一理序死已被作死的牲者。重新行交易。
*/


理方法:
1、除col1上的非聚集索引,影SELECT速度,不可取.
drop index IX_t1_col1 on t1
2、建一覆索引
A、drop index IX_t1_col1 on t1
B、create index IX_t1_col1_col2 on t1(col1,col2)


通SQL Server Profiler查死信息:

SQL Server Profiler——接例——事件取——示所有事件
:
TSQL——SQL:StmtStarting
Locks——Deadlock graph(是SQL2005新增事件,生成包含死信息的xml值)
——Lock:DeadlockChain 死中的程生事件,可死程的ID跟操作
——Lock:Deadlock 事件生了死

上一篇:常用软件简称

本文地址:软件教程 >> http://www.9xz.net/it/ruanjianjiaocheng/20348.html

下一篇:炫彩壁纸制作方法

  • 打印
推荐阅读
热门专题
推荐内容
热点内容