【案例82】客开导致数据库行锁问题

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

问题现象

顾问在操作物料-集团-保存时,发现相关操作非常卡顿,需要排查原因。

问题分析

查看NMC发现相关SQL耗时严重,是一条update语句

怀疑是缺少索引导致,故查看了相关sql的执行计划,发现索引非常好,统计信息也准,并且单次执行只需要0.1s。

 怀疑数据库出现行锁,导致事务不提交,进而把相关update语句堵塞住了。

查询堵塞源头192,为server#http-bio-8080-exec-132#物料-集团-保存导致。

反关联NMC,查看相关的线程信息发现为自己本身。也就是说相关代码在调用sql更新表中字段信息后,未提交事务,导致数据库出现了行锁。

详细信息

----相关信息已经加密

<record>
	<callid>1735786360893-5328</callid>
	<服务>server</服务>
	<线程名称>http-bio-8080-exec-132</线程名称>
	<业务动作>物料-集团-保存</业务动作>
	<线程状态>RUNNABLE</线程状态>
	<当前事件>exec sql</当前事件>
	<远程调用方法>nc.itf.bd.material.xxx.xxx.updateMaterialWithExtendVO</远程调用方法>
	<耗时>383157</耗时>
	<mwcosttime>21</mwcosttime>
	<sqlnum>26</sqlnum>
	<sqlcosttime>383129</sqlcosttime>
	<readresulttime>6</readresulttime>
	<readrownum>27</readrownum>
	<readfromclienttime>1</readfromclienttime>
	<writetoclienttime>0</writetoclienttime>
	<writetoclientbytes>0</writetoclientbytes>
	<readfromclientbytes>1845</readfromclientbytes>
	<notclosedconnectioncount>1</notclosedconnectioncount>
	<cc>2</cc>
	<cmc>0</cmc>
	<totalconn>2</totalconn>
	<客户端地址>xxx.xxx.xxx.xxx:xxxxx</客户端地址>
	<操作员>1001A1100000000BK2OW</操作员>
	<调试模式>是</调试模式>
	<操作员编码>xxx</操作员编码>
	<操作员姓名>严苗</操作员姓名>
</record>

抓取堆栈信息发现

# 方法名随机加密为XXX
... ...
uap.mw.ds.xxx.executeUpdate(UAPStatementSkelecton.java:174)
uap.mw.ds.UAPStatement.xxx(UAPStatement.java:22)
nc.jdbc.framework.crossdb.xxx.executeUpdate(CrossDBStatement.java:297)
nc.jdbc.framework.JdbcSession.xxx(JdbcSession.java:396)
nc.bs.dao.BaseDAO.executeUpdate(BaseDAO.java:161)
nccloud.service.impl.CMTManagerImpl.updateSql_RequiresNew(CMTManagerImpl.java:18)
... ...
java.lang.reflect.Method.invoke(Method.java:606)
nc.bs.framework.ejb.CMTProxyImpl.delegate_RequiresNew(CMTProxyImpl.java:37)
nc.itf.framework.ejb.xxx.delegate_RequiresNew(CMTProxyEjbBean.java:38)
nc.itf.framework.ejb.xxx.delegate_RequiresNew(CMTProxy_Local.java:33)
... ...
nc.bs.framework.ejb.xxx.invoke(AbstractEJBServiceHandler.java:57)
nc.bs.framework.ejb.xxx.invoke(AbstractEJBServiceHandler.java:36)
com.sun.proxy.$Proxy30.delegate_RequiresNew(Unknown Source)
nc.bs.framework.ejb.CMTEJBServiceHandler.invoke(CMTEJBServiceHandler.java:30)
com.sun.proxy.$Proxy623.updateSql_RequiresNew(Unknown Source)
nccloud.service.impl.xxx.refreshUpdateMark(MaterialSyncImpl.java:229)
nccloud.service.impl.MaterialSyncImpl.xxx(MaterialSyncImpl.java:234)
... ...
nc.bs.framework.ejb.CMTProxyImpl.delegate(CMTProxyImpl.java:22)
nc.itf.framework.ejb.CMTProxyEjbBean.delegate(CMTProxyEjbBean.java:44)
nc.itf.framework.ejb.CMTProxy_Local.delegate(CMTProxy_Local.java:70)
sun.reflect.GeneratedMethodAccessor117.invoke(Unknown Source)
sun.reflect.xxx.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
nc.bs.framework.ejb.AbstractEJBServiceHandler.invoke(AbstractEJBServiceHandler.java:57)
nc.bs.framework.ejb.xxx.invoke(AbstractEJBServiceHandler.java:36)
... ...

解决方案

通过顾问沟通,发现此节点发生过客开,找到客开研发人员,通知其修改代码,调用update语句后,提交事务。后续问题解决。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值