-
SQL Server死锁报错分析
概述
最近遇到一个生产环境的问题,报错如下:
事务(进程 ID 89)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
拉取了请求日志,该接口有并发的请求,在同一时刻,有多个请求。分析了下代码,主要的部分是包裹在事务中,且给主要的数据更新加了数据库资源锁。可见
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-getapplock-transact-sql?view=sql-server-ver15
但最后还是报了上面的错误。
分析
首先,这个报错,是数据库级别的报错。代码层面,看了几遍代码,考虑了各个场景并没有问题。也就是说,是在数据库中更新表的时候,SQL SERVER报错了。报错时有抓到报错的语句,分析了下,是更新某张表的字段时,报错的。一开始一直在分析代码层面,但是始终没思路。后台和同事分析了下报错的SQL语句。有这么一个问题,如果,在一个事务内,对表加了锁,但是这个更新比较慢,查看执行计划走的时候索引扫描;而这个时候有并发的情况,所有的请求都要执行这段更新的语句,那么就有问题了。如下
请求1更新时有一定的更新时间,并发请求2,3,4,5来了,那么都会排队,而且需要select 查询更新的table以及其他的资源,而请求1也会查询其它请求锁 锁住资源。一旦更新时间长,且SQL阻塞了,就会有死锁的问题。
解决
既然是SQL更新问题,那么第一查看的应该是索引。看了下索引,的确有关于这段更新SQL的索引,但是更新的字段顺序不对,导致走的时候索引扫描,而不是索引查找。满足索引查找的一般性结论:如果条件中包含WHERE或者ON的话,查询条件必须是位于索引集合列中首位,输出列排在其次,此时索引查找将会被使用。
where、on 关键字后面的字段要加上索引,一般建议是 过滤字段加索引,输出字段在Include中维护。如下示例
CREATE INDEX ix_roomguids_status_tradeguid ON dbo.s_Booking (RoomGUIDs, Status, tradeguid) INCLUDE (ProjGUID, CloseReason); CREATE INDEX ix_tradestatus_roomstatus ON s_Trade (TradeStatus, RoomStatus) INCLUDE (ZcOrderGUID, CloseReason); SELECT s_Trade.TradeGUID, dbo.s_Trade.RoomStatus, t.ProjGUID, t.CloseReason, s_Trade.ZcOrderGUID, dbo.s_Trade.CloseReason FROM ( SELECT * FROM dbo.s_Booking WHERE RoomGUIDs IS NOT NULL AND Status = '关闭') t INNER JOIN dbo.s_Trade ON s_Trade.TradeGUID = t.TradeGUID AND TradeStatus = '激活' AND RoomStatus = '认购';
输出结果
所以,给更新的SQL调整下索引。使其更新时走索引查找。最后解决此问题。
如果遇到死锁的问题,分析了代码,的确没问题。可以考虑导致死锁的语句会不会有性能问题,从索引着手。
出处:https://www.cnblogs.com/zhiyong-ITNote/p/14219290.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式