某服务器经常在执行批量更新时出现如下死锁错误,然后假死。作为一个正常的服务器,出错是允许的,假死是不允许的。
java.sql.BatchUpdateException: ORA-00060: deadlock detected while waiting for resource
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10656)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
这个问题很难重现。要解决此问题,先要能让它重现。野蛮的重现方法因多个服务器不能同时复盘故不可取,只有知道原因才好重现。
ora-60 错误是很有名的错误,google 到重现方法:
引用
两个session进入事务
session 1 update a
session 2 update b
session 1 update b (session 1 等待)
session 2 update a (session 1 出错)
此外,还有一种这样的路径:
引用
两个session进入事务
session 1 update a
session 2 update b
session 2 update a (session 2 等待)
session 1 update b (session 2 出错)
结论: 谁等待谁出错。
原理:等待者已申请的资源被先占者申请,先占者将抢到该资源,oracle 即通知等待者其申请作废。ora-60 错误就是这样一个通知。
可见,前面那个服务器有做等待。
然而,该 BatchUpdate 只操作一个表,不可能出现上面的等待。
通过翻阅 /product/app/oracle/admin/xxx/udump 中的 trace 信息,发现等待者和抢占者的语句均指向同一个表。两个session操作单表也可以死锁?
什么原因,忽然想到,行级锁!
原来,两个更新事务,彼此都在更新同一张表,假如都命中了 1、3 两行,一个按 1、3 次序命中,一个按 3、1 次序命中,就会出现上述错误了。
更小的试验是这样进行的:
引用
两个session进入事务
session 1 update a(1)
session 2 update a(3)
session 1 update a(3) (session 1 等待)
session 2 update a(1) (session 1 出错)
按此试验结果,在服务器中重现了该错误。
经重现后发现,假死原因是在使用连接池时,close(ps) 后再 prepareStatement().executeBatch 就会出现卡壳。
解决方法:在 BatchUpdateExcetion 后,应使用 ps.cancel() 释放 PrepareStatement 的事务。
再次试验问题得到解决。效果如何正在观察。
参考材料:
http://oracle-error.blogspot.com/2008/10/ora-00060-deadlock-detected-while_20.html
http://www.dnbcw.com/biancheng/oracle/ppse253790.html
分享到:
相关推荐
使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查。使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查 使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查
oracle数据库ora-01152和ora-01110的解决办法
ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法
Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法
Drop goldengate用户时,报ORA-00604 ORA-20782 ORA-06512错误
oracle网络配置(listener_ora-sqlnet_ora-tnsnames_ora).mht
ORACLE ORA-00132 ORA-00214
oracle启动失败,ORA-00702报错,windows,linux系统下解决办法
客户端进行连接的时候,系统不定期出现ora-12520,ora-12516的连接问题, 问题解决方案建议: 1、增加process和session的连接数。 2、检查连接的应用,是不是有没有释放的连接。 3、将修改参数local_listener中的vip为...
离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法,在解决ORA-01033的过程中,又出现ORA-01145 * 第 1 行出现错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机 接着的解决步骤
ORA-12541 TNSno listener 的解决方案 ORA-12541 TNSno listener 的解决方案
在运行查询SELECT * FROM V$SESSION 会出现ORA-29275:部分多字节字符的错误,这是什么原因开始我不得其解,网上也没有介绍什么好办法。本文给出答案。
oracle数据库优化之后,报错报错“ora-00838”的处理方法
ora-00845
OGG之ORA-01403案例,包括这个案例所遇到的错误详解,对使用的参数进行了详细的解说
ORA-20011,ORA06564错误分析
ORA-00604: 递归SQL层1出现错误 ORA-03106: 致命的双工通信协议错误 ORA-02063: 紧接着line(源于dblink) 以及 ORA-04052: 在查找远程对象时出错 ORA-00604: 递归SQL层1出现错误 ORA-03120: 双工转换例行程序:整数...
NULL 博文链接:https://rongren.iteye.com/blog/1886071
Oracle Database on Linux Fails to Start - ORA-27154 ORA-27300 ORA-27301 ORA-27302: failure occurred at: sskgpbitsper (Doc ID 2789636.1)