记一次公司仓库数据库服务器死锁过程及解决办法
死锁的四个必要条件:互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。 非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。 循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。 仓库拣货卡死,排查了数据库的很多地方,都没有头绪,最后到SQL Server 错误日志里查看,终于发现了蛛丝马迹 咋一看上面的错误信息,可以发现两条相同的语句造成的死锁,但是这么短的语句不可能持有排他锁太久 再仔细分析一下错误日志,发现都死锁在同一个非聚集索引上,再问了一下开发,开发那边说,这条语句是在一个大事务里面,这个事务会做7、8件事 索引属性 还有索引里面的数据,发现很多重复值 SQL语句是这样的 下图为语句生成的执行计划 当时的情况是大量SQL语句被阻塞,而阻塞的语句正是下面这条语句
上面得出几个症状 1、update语句是在一个大事务里面,事务太大导致其他session等待排他锁的时间变长 2、大家都在使用同一个非聚集索引,并扫描PricingExpressProductCode字段 3、索引里的重复值很多 从上面的症状基本可以判断,这个非聚集索引无啥用,可以禁用之
禁用之后,死锁消失,问题解决,仓库的怨气也随之消失 这一次排查过程时间有点长,但是很好定位,SQL Server错误日志给出了足够的信息定位死锁问题,所以遇到问题的时候一定要分析清楚日志 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |