已解决:云数据库RDS SQL Server出现死锁的处理方法
网站编辑2022-10-14 14:08:35375
问题描述
当应用程序频繁读写某个表或者资源时,容易出现死锁现象。出现死锁时,SQL Server会选择终止其中一个事务,并且向发起该事务的客户端发送如下错误信息。
ErrorMessage:Msg1205,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 版如果您的问题仍未解决,您可以咨询我们的在线客服,或登陆阿里云官网提交工单联系阿里云技术支持。







