本文介绍如何通过控制台查看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

关于每种死锁类型的解释,请参见锁粒度和层次结构

锁模式

事务访问资源时根据访问类型的不同,会使用不同的锁模式(LockMode)锁定资源。包含如下几种模式:
  • 共享锁(S):保证目标资源在锁定期间只能被读取,不能被修改。
  • 更新锁(U):预定对目标资源施加排它锁(X),在资源被当前事务施加排它锁之前,保证该资源不会被其他事务修改。
  • 排它锁(X):保证目标资源在锁定期间无法被其他事务访问。

关于锁模式的更多信息,请参见锁模式

操作步骤

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏,选择CloudDBA > 锁优化

页面介绍

  • 死锁数量概览死锁数量

    可分时段查看近期产生的死锁数量。

  • 死锁变化趋势死锁变化趋势
    展示某个时间段内发生的死锁类型。您可以执行如下操作:
    • 选择起始日期结束日期,单击查找显示指定时间段的死锁信息。
      说明 指定的时间间隔不能超过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)客户端打开并查看。