2018年(273)
分类: 大数据
2018-07-02 15:14:36
一、什么是死锁?
简单来说,我和你,金锁和银锁。
我拿着金锁,我需要再拿到银锁,才能完成任务,
你拿着银锁,你需要再拿到金锁,才能完成任务。
我拿不到银锁,你拿不到金锁,这就形成死锁了。
二、死锁发生后,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日志中获取到死锁信息
DBCC TRACEON(1222,-1)