一、什么是死锁?
简单来说,我和你,金锁和银锁。
我拿着金锁,我需要再拿到银锁,才能完成任务,
你拿着银锁,你需要再拿到金锁,才能完成任务。
我拿不到银锁,你拿不到金锁,这就形成死锁了。
二、死锁发生后,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 --金锁
结果:
1、捕获死锁,方法较多,常用的两种方法
>>打开跟踪标志 1222 [RDS不支持],可以从SQL SERVER日志中获取到死锁信息
>>>阅读全文