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

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

仓库拣货卡死,排查了数据库的很多地方,都没有头绪,最后到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 

时间: 09-23

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

git仓库服务器SSH认证示例

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

[转]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也

Cacti监控mysql数据库服务器实现过程

Cacti监控mysql数据库服务器实现过程 2014-05-29      0个评论    来源:Cacti监控mysql数据库服务器实现过程   收藏    我要投稿 1 先在cacti服务器端安装mysql模板 wget https://mysql-cacti-templates.googlecode.com/files/better-cacti-templates-1.1.8.tar.gz tar –xvf better-cacti-templates-1.1.8.tar.gz cd b

SSL服务器认证过程通俗理解!

理解有错误的地方,请高手指正! 1,CA中心,有一套自己的公钥和私钥,服务器用自己的私钥去生成一个自认证的证书 2,CA中心的自认证证书是有公信力的,一般被客户端所熟知,发放到每个客户端! 3,客户端需要将CA中的自认证证书加入信任列表! 4,服务器要加入CA体系,要向CA中心申请,CA中心验证了服务器的资料后,向server发放一个证书(key),里面包含了一个秘钥 5,CA发给server的证书是用CA自己的秘钥和申请者的秘钥(key)加密过的, 6,证书里面包含:申请者的身份信息.申请者公