SQL优化中的重要概念:死锁

 

上面几篇文章讲到 事务、锁定、阻塞,最后还有一种比较极端的情况,就是死锁,这也是锁定、阻塞的一种情况。

死锁是当两个事务分别锁定了资源,而又继续请求对方已获取的资源,那么就会产生死锁。


发生死锁的原因:
A、会话以不同的顺序访问表。
B、会话长时间运行事务,在一个事务中更新了很多表或行,这样增加了冲突的可能。
C、会话1申请了一些行锁,会话2申请了一些行锁,之后决定将其升级为表锁。
   如果这些行在相同的数据页面中,并且两个会话同时在相同的页面上升级锁粒度,就会产生死锁。

 

1、会话1

set lock_timeout 1000 
--跟踪死锁--会话1
set transaction isolation level serializable

begin tran

update t
set v ='563'
where idd =2

waitfor delay '00:00:10'

update t
set v = '963'
where idd =1

COMMIT

2、会话2

set transaction isolation level serializable

begin tran

update t
set v ='234'
where idd =1

waitfor delay '00:00:10'

update t
set v = '987'
where idd=2

commit

3、再开启一个会话,开启跟踪

开启跟踪标志位:
              DBCC TRACEON(trace#[,...n],-1) [With No_InfoMsgs]

检查某种或某些标志位是开启,还是关闭:
              DBCC TRACESTATUS(trace#[,...n],-1) [With No_InfoMsgs]

1.trace#:指定一个或多个需要开启或需要检查状态的跟踪标志位数字
2.    -1:如果指定了-1,则以全局方式打开某种或某些跟踪标志位
3.with No_InfoMsgs:当命令中包含此参数时,则禁止DBCC输出信息性消息


--跟踪1222能把详细的死锁信息返回到SQL Server的日志中
--标志位-1表示跟踪标志位1222应该对所有SQL Server连接全局启用
DBCC TraceOn(1222,-1)
go

--验证标志位是否启动
DBCC TraceStatus
go

--关闭标志位
DBCC TraceOff(1222,-1)
go

4、设置死锁优先级--设置死锁的优先级,调整一个查询会话由于死锁而被终止运行的可能性

SET DeadLock_Priority  Low | Normal | High | numeric-priority

--是当前连接很有可能被终止运行
set deadlock_priority Low 

--SQL Server终止回滚代价较小的连接
set deadlock_priority Normal 

--减少连接被终止的可能性,除非另一个连接也是High或数值优先级大于5
set deadlock_priority High 

--数值优先级:-10到10的值,-10最有可能被终止运行,10最不可能被终止运行,
--两个数字谁大,谁就越不可能在死锁中被终止
set deadlock_priority 10

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值