本文介绍如何通过控制台查看RDS SQL Server数据库中的死锁及其详细信息。
前提条件
实例不能是RDS SQL Server 2008 R2云盘版。
背景信息
由于事务的特殊机制,一个事务对特定资源进行修改的同时会锁定该资源,防止其他并发事务对该资源进行修改,以达到数据一致性的目的。
死锁(DeadLock)通常是由多个事务互相竞争资源引发的。例如,事务A在修改资源A的同时,发起了对资源B的修改,而此时事务B正在修改资源B,并且对资源A发起了修改,便会引发死锁。如下图所示。
死锁会导致受害者会话(即使用成本相对较低的SQL语句的会话)被系统终止(Kill),无法完成该会话既定的任务。
为解决上述问题,RDS提供了DeadLock统计页面。通过查看该页面,可快速定位数据库中发生的多种类型的死锁。死锁的详细信息页面展示了事务开始执行的时间、会话ID、被锁资源详情、死锁的类型等信息,帮助您定位和优化引发死锁的问题SQL及其他异常。
死锁类型
DeadLock统计页面中包含如下5种死锁类型:
KeyDeadlock
ObjectDeadLock
RIDDeadlock
PageDeadlock
ComplieDeadlock
关于每种死锁类型的解释,请参见Lock Granularity and Hierarchies。
锁模式
事务访问资源时根据访问类型的不同,会使用不同的锁模式(LockMode)锁定资源。包含如下几种模式:
共享锁(S):保证目标资源在锁定期间只能被读取,不能被修改。
更新锁(U):预定对目标资源施加排它锁(X),在资源被当前事务施加排它锁之前,保证该资源不会被其他事务修改。
排它锁(X):保证目标资源在锁定期间无法被其他事务访问。
关于锁模式的更多信息,请参见Lock Modes。
操作步骤
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏,选择 。
页面介绍
死锁数量概览
可分时段查看近期产生的死锁数量。
死锁变化趋势
展示某个时间段内发生的死锁类型。您可以执行如下操作:
选择起始日期和结束日期,单击查找显示指定时间段的死锁信息。
说明指定的时间间隔不能超过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)客户端打开并查看。