Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393695
  • 博文数量: 273
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1430
  • 用 户 组: 普通用户
  • 注册时间: 2018-02-02 15:57
文章分类

全部博文(273)

文章存档

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 --金锁

结果:


29dea87600c6fc0874c0dbdc70cea4d4f7abb95a


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

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

DBCC TRACEON(1222,-1)


阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~