已解决:云数据库RDS SQL Server出现死锁的处理方法

网站编辑2022-10-14 14:08:35375

  问题描述

  当应用程序频繁读写某个表或者资源时,容易出现死锁现象。出现死锁时,SQL Server会选择终止其中一个事务,并且向发起该事务的客户端发送如下错误信息。

 ErrorMessageMsg1205,Level13,State47,Line1Transaction(ProcessID53)wasdeadlockedonlockresourceswithanotherprocess
 andhasbeenchosenasthedeadlockvictim.Rerunthetransaction.

  解决方案

  阿里云提醒您:
  如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
  1、使用客户端连接实例。
  2、监控相关视图。

  执行如下SQL语句,循环监控sys.sysprocesses。

while1=1
 begin
 select*fromsys.sysprocesseswhereblocked<>0
 waitfordelay'[$Time]'
 end

  注:[$Time]循环间隔时间可以自定义,例如00:00:01。
  系统显示类似如下。
  提示:监控结果中blocked列的值为阻塞该会话的阻塞源会话ID,waitresource为被阻塞的会话等待的资源。从上述结果可以看到,spid 53和spid 56相互阻塞,形成了死锁。

  3、执行如下SQL语句,循环监控sys.dm_tran_locks和sys.dm_os_waiting_tasks等视图。

 while1=1
 Begin
 SELECT
 db.nameDBName,
 tl.request_session_id,
 wt.blocking_session_id,
 OBJECT_NAME(p.OBJECT_ID)BlockedObjectName,
 tl.resource_type,
 h1.TEXTASRequestingText,
 h2.TEXTASBlockingText,
 tl.request_mode
 FROMsys.dm_tran_locksAStl
 INNERJOINsys.databasesdbONdb.database_id=tl.resource_database_id
 INNERJOINsys.dm_os_waiting_tasksASwtONtl.lock_owner_address=wt.resource_address
 INNERJOINsys.partitionsASpONp.hobt_id=tl.resource_associated_entity_id
 INNERJOINsys.dm_exec_connectionsec1ONec1.session_id=tl.request_session_id
 INNERJOINsys.dm_exec_connectionsec2ONec2.session_id=wt.blocking_session_id
 CROSSAPPLYsys.dm_exec_sql_text(ec1.most_recent_sql_handle)ASh1
 CROSSAPPLYsys.dm_exec_sql_text(ec2.most_recent_sql_handle)ASh2
 waitfordelay'[$Time]'
 End

  系统显示类似如下。
  注:
  DBName:request_session_id操作的数据库。
  request_session_id:当前请求的会话 ID,即被阻塞的会话。
  blocking_session_id:阻塞源会话ID。
  BlockedObjectName:被阻塞的会话操作的对象。
  resource_type:等待的资源类型。
  RequestingText:当前会话执行的语句,即被阻塞的语句。
  BlockingText:阻塞源会话执行的语句。
  request_mode:当前会话请求的锁模式。
  4、如果您使用的是RDS SQL Server 2012,您还可以使用SQL Server Profiler来监控和抓取死锁图谱,如下所示。
  抓取的死锁图谱如下所示。
  5、按照实际情况进行调优。
  6、关闭阻塞源会话,可以帮助快速解除阻塞。
  7、查看是否有长时间未提交的事务,及时提交事务。

  8、使用with(nolock)进行查询。

select*fromtablewith(nolock)

  9、检查应用程序逻辑,按顺序访问某个资源。

  适用于

  云数据库 RDS SQL Server 版
  如果您的问题仍未解决,您可以咨询我们的在线客服,或登陆阿里云官网提交工单联系阿里云技术支持。

最新推荐

右侧广告图1
  • 云数据库 RDS

    高性价比、稳定安全可靠的云数据库 RDS 即开即用、“自动驾驶”,助您免除数据库运维烦恼

    88.00/年

    折扣优惠,高性价比,安全稳定

  • 云数据库 RDS PostgreSQL 版

    基于云原生架构,软硬协同优化,提供稳定可靠、高性价比的数据库服务。通过丰富的插件拓展,支撑各领域场景化业务,如自研Ganos多维多模时空引擎及开源PostGIS地理信息引擎、向量引擎、时序引擎等百余款插件。

    1231.20/年

    1年7.5折起 不限数量

  • 云数据库 ClickHouse

    开箱即用,高吞吐写入,秒级实时分析、自动弹性优势。 广泛应用于流量分析、广告营销分析、行为分析、人群划分、客户画像、敏捷BI、数据集市、网络监控、分布式服务和链路监控等业务场景。

    1473.40/月

    1年85折

右侧广告图2