SQL Server 死锁问题的分析

一、什么是死锁?

简单来说,我和你,金锁和银锁。

我拿着金锁,我需要再拿到银锁,才能完成任务,

你拿着银锁,你需要再拿到金锁,才能完成任务。

我拿不到银锁,你拿不到金锁,这就形成死锁了。


二、死锁发生后,SQL Server怎么处理?

SQL Server内置有死锁侦测和处理机制,每5S会检测一次,如果有死锁,就会评估下哪个事务回滚的开销比较低,将其kill掉,然后反馈1205错误。

实际上并没有这么简单,比如可以设置会话的优先级,优先级越低,被选为牺牲品的可能性就越大。


三、死锁发生后怎么处理?

捕获死锁>>分析死锁>>解决方案


先模拟获取死锁的demo

/*建表*/
CREATE TABLE [dbo].[deadlockTest](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[userid] [varchar](10) NULL,
	[num] [int] NULL,
 CONSTRAINT [PK_deadlockTest] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

/*建索引*/
create index ix_userid on deadlockTest(userid)

/*生成测试数据*/
insert into deadlockTest select 1,1
insert into deadlockTest select 2,2

/*事务1*/		--我
begin tran 
update deadlockTest set num=100 where id=1	--金锁

update deadlockTest set num=100 where id=2	--银锁   !!注意这一句执行事务2后,回来再执行

/*事务2*/		--你
begin tran 
update deadlockTest set num=100 where id=2 --银锁

update deadlockTest set num=100 where id=1	--金锁

结果:

29dea87600c6fc0874c0dbdc70cea4d4f7abb95a


1、捕获死锁,方法较多,常用的两种方法

>>打开跟踪标志 1222 [RDS不支持],可以从SQL SERVER日志中获取到死锁信息


>>>阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值