记录一次死锁排查过程

这篇博客讨论了一个在线环境中遇到的数据库死锁问题。在并发的两个更新操作中,由于不在同一个事务内,导致了数据库死锁。日志显示一个UPDATE语句执行时被卡住,没有错误信息。解决步骤包括使用jstack工具定位Java进程,通过jstack-l导出日志并查找'Found one Java-level deadlock'关键字以定位代码问题。文章提供了详细的排查流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同一条数据,两个更新操作,不在一个事务里面,导致死锁,后台日志到了一个update语句就卡住了,也没有报错,线上环境是用的linux服务器,

      at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.jav
a:4798)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:
4875)
        - locked <0x00000006df01ee80> (a oracle.jdbc.driver.T4CConnection)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatemen
tWrapper.java:1361)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedSt
atement.java:105)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedSt
atement.java:105)
        at com.epxing.frame.database.BasicDBContext.update(BasicDBContext.java:993)
        at com.epxing.frame.database.BasicDBContext.update(BasicDBContext.java:927)
        at com.epxing.frame.database.BasicDBContext.update(BasicDBContext.java:823)
        at com.epxing.frame.bo.BasicEntityBO.update(BasicEntityBO.java:334)
        at com.epxing.frame.bo.BasicEntityBO.update(BasicEntityBO.java:305)
        at com.epxing.project.xajtdx.register.bo.StaffRegisterBO_XAJTDX.handleEvent(StaffRegister
BO_XAJTDX.java:555)
        at com.epxing.frame.process.util.ProcessUtil.processEvent(ProcessUtil.java:141)
        at com.epxing.frame.process.bo.ProcessBO.next(ProcessBO.java:159)
        at com.epxing.project.xajtdx.process.bo.ProcessBO_XAJTDX.handleTask(ProcessBO_XAJTDX.java
:121)
        at com.epxing.frame.process.bo.ProcessBO.handleTask(ProcessBO.java:206)
        at com.epxing.project.xajtdx.staff.action.StaffAction_XAJTDX.updateAndEntityHandleTask(St
affAction_XAJTDX.java:175)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.epxing.frame.control.SimpleAction.processAction(SimpleAction.java:179)
        at com.epxing.frame.control.SimpleAction.process(SimpleAction.java:132)
        at com.epxing.frame.control.FrameServlet.service(FrameServlet.java:55)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChai
n.java:232)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:1
67)

解决办法:

1、使用jstack工具,首先用ps -ef|grep java 查询当前的java进程,

ps -ef|grep java

2、使用 jstack -l [进程号]>lock.jstack 命令将日志导出到lock.jstack文件中

jstack -l 1111 >lock.jstack

3、使用less命令查询lock.jstack文件,找到对应报错地方,打开文件一直翻,直到找到 "Found one Java-level deadlock:"关键字,就可以找对应的代码的位置了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值