记一次公司仓库服务器死锁过程

记一次公司仓库服务器死锁过程

仓库拣货卡死,排查了数据库的很多地方,都没有头绪,最后到SQL Server 错误日志里查看,终于发现了蛛丝马迹

EXEC xp_readerrorlog 0,1,NULL,NULL,‘2015-09-21‘,‘2015-10-10‘,‘DESC‘
     waiter id=process5c30e08 mode=U requestType=wait
    waiter-list
     owner id=process5c26988 mode=X
    owner-list
   keylock hobtid=72057597785604096 dbid=33 objectname=stoxxx.dbo.Orderxxx indexname=IX_PricingExpressProductCode_State id=lock17fa96980 mode=X associatedObjectId=72057597785604096
     waiter id=process5c26988 mode=U requestType=wait
    waiter-list
     owner id=process5c30e08 mode=X
    owner-list
   keylock hobtid=72057597785604096 dbid=33 objectname=stoxxx.dbo.Orderxxx indexname=IX_PricingExpressProductCode_State id=lock87d69e780 mode=X associatedObjectId=72057597785604096
  resource-list
(@OperateState money,@HandledByNewWms bit,@State int,@OrderOut int)
UPDATE [Orderxx] SET [OperateState] = @OperateState,[HandledByNewWms] = @HandledByNewWms WHERE (([Orderxxx].[State] = @State) And ([Orderxxx].[OrderOut] = @OrderOut) And ([Orderxxx].[PricingExpressProductCode] IN (‘UKNIR‘)))
    inputbuf
unknown
     frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
UPDATE [Orderxxx] SET [OperateState] = @OperateState,[HandledByNewWms] = @HandledByNewWms WHERE (([Orderxxx].[State] = @State) And ([Orderxxx].[OrderOut] = @OrderOut) And ([Orderxxx].[PricingExpressProductCode] IN (‘UKNIR‘)))
     frame procname=adhoc line=1 stmtstart=134 sqlhandle=0x020000009d376d18a17e7ea51289d8caa2fb4de65c976389
    executionStack
   process id=process5c30e08 taskpriority=0 logused=10320 waitresource=KEY: 33:72057597785604096 (112399c2054a) waittime=4813 ownerId=31578743038 transactionname=user_transaction lasttranstarted=2015-09-24T10:22:58.410 XDES=0x372e95950 lockMode=U schedulerid=17 kpid=8496 status=suspended spid=153 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2015-09-24T10:22:58.540 lastbatchcompleted=2015-09-24T10:22:58.540 clientapp=.Net SqlClient Data Provider hostname=CK1-WIN-WEB02 hostpid=37992 loginname=ck1.biz isolationlevel=read committed (2) xactid=31578743038 currentdb=33 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
(@OperateState money,@HandledByNewWms bit,@State int,@OrderOut int)UPDATE [Orderxxx] SET [OperateState] = @OperateState,[HandledByNewWms] = @HandledByNewWms WHERE (([Orderxxx].[State] = @State) And ([Orderxxx].[OrderOut] = @OrderOut) And ([Orderxxx].[PricingExpressProductCode] IN (‘UKNIR‘)))
    inputbuf
unknown
     frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
UPDATE [Orderxxx] SET [OperateState] = @OperateState,[HandledByNewWms] = @HandledByNewWms WHERE (([Orderxxx].[State] = @State) And ([Orderxxx].[OrderOut] = @OrderOut) And ([Orderxxx].[PricingExpressProductCode] IN (‘UKNIR‘)))
     frame procname=adhoc line=1 stmtstart=134 sqlhandle=0x020000009d376d18a17e7ea51289d8caa2fb4de65c976389
    executionStack
   process id=process5c26988 taskpriority=0 logused=9892 waitresource=KEY: 33:72057597785604096 (70f5b089bb2b) waittime=4813 ownerId=31579268946 transactionname=user_transaction lasttranstarted=2015-09-24T10:27:01.357 XDES=0x98312f950 lockMode=U schedulerid=16 kpid=9184 status=suspended spid=454 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2015-09-24T10:27:01.490 lastbatchcompleted=2015-09-24T10:27:01.487 clientapp=.Net SqlClient Data Provider hostname=CK1-WIN-WEB02 hostpid=37992 loginname=ck1.biz isolationlevel=read committed (2) xactid=31579268946 currentdb=33 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
  process-list
 deadlock victim=process5c26988
deadlock-list

咋一看上面的错误信息,可以发现两条相同的语句造成的死锁,但是这么短的语句不可能持有排他锁太久

再仔细分析一下错误日志,发现都死锁在同一个非聚集索引上,再问了一下开发,开发那边说,这条语句是在一个大事务里面,这个事务会做7、8件事

还有索引里面的数据,发现很多重复值

SQL语句是这样的

(@OperateState money,@HandledByNewWms bit,@State int,@OrderOut int)
@HandledByNewWms=(1)  @OperateState=($1.0000)  @OrderOut=(4055484)  @State=(3) 

UPDATE [Orderxxx] SET [OperateState] = $1.0000,[HandledByNewWms] = 1
WHERE (([Orderxxx].[State] = 3) And ([Orderxxx].[OrderOut] = 4055484) And ([Orderxxx].[PricingExpressProductCode] IN (‘UKRRM‘,‘UKRLE‘)))

语句生成的执行计划

当时的情况是大量SQL语句被阻塞,而阻塞的语句正是下面这条语句

UPDATE [Orderxxx] SET [OperateState] = $1.0000,[HandledByNewWms] = 1
WHERE (([Orderxxx].[State] = 3) And ([Orderxxx].[OrderOut] = 4055484) And ([Orderxxx].[PricingExpressProductCode] IN (‘UKRRM‘,‘UKRLE‘)))

解决方法

上面得出几个症状

1、update语句是在一个大事务里面

2、大家都在使用同一个非聚集索引

3、索引里的重复值很多

从上面的症状基本可以判断,这个非聚集索引无啥用,可以禁用之

ALTER INDEX [IX_PricingExpressProductCode_State] ON [dbo].[Orderxxx] DISABLE

禁用之后,死锁消失,问题解决,仓库的怨气也随之消失

这一次排查过程时间有点长,但是很好定位,SQL Server错误日志给出了足够的信息定位死锁问题,所以遇到问题的是一定要分析清楚日志

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

时间: 2024-11-13 02:12:18

记一次公司仓库服务器死锁过程的相关文章

记一次个人站点服务器拆迁过程

起因 前段时间想着将博客站设置https,在实践的过程中出了不少错误,而且发现现在的服务端不利于快速维护.所以考虑再三直接重新搞了一个服务器.在此记录过程. 步骤简要 快照一下硬盘 将整个站点文件夹down到本地 进入数据库导出数据库- 重装纯净Linux系统(注意版本) 安装宝塔面板(最终选择了这个) 使用面板安装站点,创建数据库(记得和之前的站点信息要一致) 将down下的文件放到站点目录 导入数据库-备份成功 首先为了出现意外我把整个服务硬盘先备份了一下,之后下载整个站点的文件,下载完之后

git仓库服务器SSH认证示例

git在用户管理及管理上,下面上三种解决办法: 如果需要团队里的每个人都对仓库有写权限,又不能给每个人在服务器上建立账户,那么提供 SSH 连接就是唯一的选择了.我们假设用来共享仓库的服务器已经安装了 SSH 服务,而且你通过它访问服务器.    有好几个办法可以让团队的每个人都有访问权. 第一个办法是给每个人建立一个账户,直截了当但过于繁琐.反复的运行 adduser 并且给所有人设定临时密码可不是好玩的.     第二个办法是在主机上建立一个 git 账户,让每个需要写权限的人发送一个 SS

记一个网络传输功能的实现过程

写在前面的话:功能是基于C/S模型的网络传输实现,要求是服务器端可以在局域网中任何机子上运行,客户端启动后自动寻找服务器端进行连接,之后,服务器端向已经连接的客户端发送命令,客户端根据命令执行相应的操作(即发送某个约定文件夹下的所有文件),并且客户端不需要用户操作. 1.思路 首先,对于这个功能的实现思路如下,因为服务器不确定在哪个机子上,所以为了寻找到服务器端,客户端需要发送广播消息,并且为了维护客户端在线,广播消息需要实现成心跳包(即定时发送广播消息).服务器监听心跳包,如果是新加入的客户端

[转]windows 7系统搭建本地SVN服务器的过程

windows 7系统搭建本地SVN服务器的过程 1.安装svn:TortoiseSVN-1.7.9.23248-x64-svn-1.7.6; 1.在PC机的D盘创建如下目录:D:\svn\project\workspace; 2.右键点击目录workspace文件,选择Tortoise->Create repository here,即在此创建版本库(Y); 然后你就会看到D:\svn\project\workspace 里面多了conf, db, hooks, lock等文件,版本库创建成功

公司网站服务器为什么要托管?

1.服务器不是普通电脑,它需要24小时全天开着机,365天从不间断的工作,如果是普通电脑,是承担不了这样的工作的.所以它的配置要求就比较高,而电脑的散热也更为重要,因而服务器需要放置在一个相对稳定适宜的环境中,恒温.恒湿.防尘.供电等必不可少.普通公司很难有条件专门为服务器建立一间机房,那有人就会说:用空调保证恒温恒湿防尘供电呢?适宜人生存的温度不适用于服务器,相反适宜服务器的温度又不是适应人的生存.而且这方面的维护成本会很高.西安天互通信有限公司,主要从事于IDC服务业务.对于服务器托管,自己

【夯实Mysql基础】记一次mysql语句的优化过程!

1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使用了 2个 order by和 1个limit的分页 sql. 一个sql是上一个sql的count(*),即链接了5个表,当然没有limit了(取总数). 2. [着手优化] 1)[优化思路] 第一条是 做client调用 service层的数据缓存 第二条就是 优化sql本身. 这里着重讲一下

Cacti监控Tomcat服务器实现过程

1 首先去官网上面下载通用的监控模板 一般使用TomcatStats-0.1.zip 模板居多,下载地址: http://forums.cacti.net/download/file.php?id=12310, 在linux服务器上面使用wget下载,wget http://forums.cacti.net/download/file.php?id=12310,报如下错误: 正在连接 forums.cacti.net|173.225.179.10|:80... 已连接. 已发出 HTTP 请求,

Node.js, Express的服务器搭建过程的问题

Node.js, Express的服务器搭建过程的问题 Express : node.js 的框架,根据2012年BYvoid的说法,是node.js官方唯一推荐的框架 怎么搭建项目? - 安装nodejs->npm->express - express 的问题: 2017年, express-generator已经被独立成命令行工具了,所以要用 npm install express-generator 这样才能用express命令 怎么启动项目? 启动服务器可以用node app.js,因

记一次dell R720服务器ESXI5.5系统宕机的奇葩经历

?记一次dell R720服务器ESXI5.5系统宕机的奇葩经历? 总结点: 1,  没看宕机的原因. 2,  无故重置bois. 3,  不看日志. 4,  Dell r720服务器 内存需要按照顺序插入,如:A1,A2,A3,A4. 5,  使用idrac远程管理页面. 6,  要有自己的判断问题思路,不要什么都依着400. 7,  对问题不重视,要不然就不会直接重启设备了. 失误点一:没看宕机的原因 17号下午5点多的时候,正用着服务器上的虚拟机工作时,mstsc窗口突然断开了.Ping也