TX - row lock contention分享一次锁表故障处理

Posted 久违的太阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TX - row lock contention分享一次锁表故障处理相关的知识,希望对你有一定的参考价值。

一个医院客户,在业务高峰期间,发现自助机的挂号业务非常缓慢,但是窗口人工挂号却不受影响,速度正常.

远程过去,检查业务高峰期间数据库的等待事件,发现有很多的行锁:

 这里发现有大量的update锁表操作,

对此sql进行了分析,发现执行计划是正常的,走的是主键,说明sql执行效率是没有问题的,那可能就是并发的问题了.这里的where过滤条件使用了绑定变量,检查绑定变量的值:

这里发现,在使用自助业务的时候,这里的收款员都是启航自助.而人工挂号的时候,这里的操作员是每个医生.

因此这里就可以定位了原因了:

医院有很多个自助机,当在业务高峰期的时候,每个自助机挂号的时候,都是同时修改同一条数据,因为所有的自助机的收款员都一样.这样只要有一台自助机慢或者不提交,就会使其它自助机进入等待.

而为什么人工窗口正常呢,因为人工每个窗口的收款员是每个医生账户,每个医生同时只会收款一个患者,窗口之间不会互相影响

那原因定位了,解决就很好办了,为每个自助机单独使用一个账户就能解决.

这里总结一下:

TX锁在等待事件中属于application,即应用不合理,一般我们要找出相关的sql语句,首先先看sql执行效率是否正常,再检查业务逻辑,是否有大并发的update同时修改同一条数据 

以上是关于TX - row lock contention分享一次锁表故障处理的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 数据库发生等待事件:enq: TX - row lock contention ,排查思路

enq: TX - row lock contention故障处理一则

TX - row lock contention分享一次锁表故障处理

TX - row lock contention分享一次锁表故障处理

我必须在调用* sql.Tx.Rollback()之前调用* sql.Rows.Close()吗?

MySQL for update 到底是 row lock / table lock