RDS SQL Server提供了死锁统计(DeadLock)页面,展示事务的开始时间、会话ID、被锁资源详情及死锁类型等信息,帮助您快速定位和优化引发死锁的问题SQL及其他异常。本文介绍通过RDS控制台查看RDS SQL Server数据库中的死锁及其详细信息的方法。
背景信息
由于事务的特殊机制,一个事务对特定资源进行修改时会锁定该资源,以防其他并发事务对同一资源进行修改,从而保证数据一致性。
死锁通常由多个事务互相竞争资源引发,例如事务A锁定资源A并尝试修改资源B,而事务B锁定资源B并尝试修改资源A,导致双方相互等待对方释放资源,最终导致死锁,此时系统会自动终止成本较低的SQL语句会话(即受害者会话),使无法完成该会话既定任务。如下图所示:

死锁类型
DeadLock统计页面中包含如下5种死锁类型:
- KeyDeadlock 
- ObjectDeadLock 
- RIDDeadlock 
- PageDeadlock 
- ComplieDeadlock 
锁模式
事务访问资源时,会根据访问类型使用不同的锁模式(LockMode),包括以下几种:
- 共享锁(S):保证目标资源在锁定期间只能被读取,不能被修改。 
- 更新锁(U):预定对目标资源施加排它锁(X),在资源被当前事务施加排它锁之前,保证该资源不会被其他事务修改。 
- 排它锁(X):保证目标资源在锁定期间无法被其他事务访问。 
前提条件
- 不支持RDS SQL Server 2008 R2云盘版实例。 
- 实例所在地域目前仅支持:华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、华南2(河源)、华南3(广州)、西南1(成都)、中国(香港)、新加坡、阿联酋(迪拜)。 
查看死锁详情
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。 
- 在左侧导航栏,选择。 
DeadLock页面介绍
- 死锁数量概览- 展示近期产生的死锁数量,支持分时段查看。  
- 死锁变化趋势- 展示某时间段内发生的死锁类型,支持以下操作: - 选择起始日期和结束日期,单击查找显示指定时间段的死锁信息(时间间隔不得超过30天)。 
- 单击近一天、近一周、近一月快捷查询所选时间段的死锁信息。 
- 将鼠标移动到特定时间点,查询该时间点内发生的死锁类型和数量。 
- 单击趋势图右上角的  图标,切换趋势图的显示样式或下载当前趋势图。 图标,切换趋势图的显示样式或下载当前趋势图。
  
- 死锁详细信息  - 单击左边的  图标,查看相互锁定的会话详情,包含如下内容: 图标,查看相互锁定的会话详情,包含如下内容:- LastTranStarted:事务开启的时间。 
- SPID:开启事务的会话ID。 
- IsVictim:该会话是否已被终止(kill)。 说明- SQL Server解决死锁的方法是通过一个内部线程定期检测系统死锁,发现死锁后,在引发死锁的会话之间终止成本相对较低的会话。例如:SELECT语句的成本比UPDATE更低,系统便会优先终止使用SELECT的会话。 
- LogUsed:会话已经生成的日志大小。单位:字节。 
- LockMode:锁模式。 
- WaitResourceDesc:当前事务等待中的资源详情。 
- ObjectOwned:已经被锁住的对象。 
- ObjectRequested:当前事务请求加锁的对象。 
- WaitResource:当前事务等待中的资源。 
- HostName:当前事务的主机名称。 
- LoginName:当前事务的账号名称。 
- Status:当前事务的状态。 
- ClientApp:当前事务所使用的客户端名称。 
- SQLText:SQL语句详情。 说明- 单击该SQL语句可打开SQL语句窗口,单击点击复制可快速复制SQL语句,方便排查或回溯有问题SQL。 
 - 单击任意一行内容可在下方展示对应的死锁关系图。 
- 死锁关系图- 展示发生死锁的会话之间的相互关系及被锁定资源的详细信息。您可以单击点击下载按钮下载记录当前死锁详细内容的XDL文件,可通过SQL Server Management Studio(SSMS)客户端打开并查看。 