`
inshua
  • 浏览: 8439 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

一次ORA-60的诊断

阅读更多
某服务器经常在执行批量更新时出现如下死锁错误,然后假死。作为一个正常的服务器,出错是允许的,假死是不允许的。

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
分享到:
评论

相关推荐

    ora-12519错误解决方案

    `SCOPE=SPFILE`表示更改将被写入服务器参数文件,并在下一次启动时生效。 ##### 2. 重启数据库 修改参数后,需要重启数据库以使更改生效: ```sql SHUTDOWN IMMEDIATE; STARTUP; ``` #### 四、监控资源消耗 在...

    Oracle 数据库常见问题诊断方法

    - 如果偶尔出现一次,可能是由于网络波动或用户异常中止连接。 - 如果频繁出现,则可能是客户端与服务端的字符集不一致。 - **措施**: - 如果是偶尔出现的问题,可以在服务端的协议配置文件 `PROTOCOL.ORA` 中...

    Oracel 错误码查询

    - 确认每列只定义一次唯一或主键约束; - 调整SQL语句以避免重复定义。 ##### ORA-02260: 表只能具有一个主键 - **原因**:试图为一个表定义多个主键。 - **解决方法**: - 确认每个表只有一个主键; - 删除...

    Oracle常见错误诊断

     原因:如果偶尔出现一次,则可能为网络原因或用户异常中止,如果经常出现则为客户端与服务端的字符集不一致。  措施:如果偶尔出现,可在服务端的协议配置文件PROTOCOL.ORA中增加一行  TCP.NODELAY=YES;  如果...

    Oracle错误代码集合[参考].pdf

    14. ORA-17020: 无效的行预取,预取是指一次性获取多行数据的机制,这里的错误可能意味着预取设置不正确。 15. ORA-17021 至 ORA-17050: 包含一系列的类型定义、数据处理和转换错误,例如丢失的定义、不支持的特性、...

    SHOUG文档分享-ORACLE-TTS迁移后ORA3113错误处理-SHOUG成员左翼

    案例中指出,此错误发生在迁移完成后的一次查询操作中。Oracle数据库的告警日志是诊断问题的关键资源,它记录了系统运行期间的关键事件。通过对告警日志的分析,找到了一个ORA-07445错误,这是一个严重的内部错误,...

    oracle异常(最全异常收集)

    - 确保每个游标仅在一个作用域内被打开一次。 - 在使用完游标后立即关闭它。 #### ORA-6530:ACCESS_INTO_NULL - **异常说明**:访问空值。 - **常见原因**: - 访问未初始化或已设置为 NULL 的对象属性。 - ...

    oracle 10g 导入 9i 00003 错误解决.txt

    - 在执行导入操作之前,可以先进行一次完整的导出操作,然后再导入到目标数据库中。 6. **查阅官方文档**: - 如果以上方法都无法解决问题,建议查阅Oracle官方文档,特别是关于版本升级和数据迁移的部分。例如,...

    《Oracle DBA手记——数据库诊断案例与性能优化实践》第一章 to be continued

    ├─第一篇 DBA工作手记 │ 01.Eygle的DBA工作手记 │ 02.Yangtingkun的DBA工作手记 │ 03.老熊的DBA手记 │ 04.BanPing的DBA工作手记 │ ├─第二篇 诊断案例篇 │ 01.ASM案例分析与诊断 ...一次排序的调整与优化

    Oracle数据库常见问题诊断方法.pdf

    - 如果这些错误偶尔出现一次,可能是由于网络波动或用户意外终止连接导致的。 - 如果这些错误频繁出现,则很可能是客户端与服务端的字符集设置不一致所致。 **3. 措施** - 对于偶尔出现的情况,可以在服务端的协议...

    Oracle sqlnet.ora配置

    设置一个合理的值(如`SQLNET.EXPIRE_TIME = 15`,表示15分钟检查一次)有助于维护数据库性能。 7. **ADR_BASE**: 定义了Oracle诊断目录,所有日志和跟踪文件都将存储在这里。这个目录应该具有足够的空间以容纳...

    Oracle数据库错误消息

    Oracle数据库在运行过程中可能会遇到各种错误,这些错误通常由特定的错误代码标识,并附带详细的错误消息,以帮助用户诊断和解决问题。以下是对部分Oracle数据库错误消息的详细解析,涵盖从EXP-00000至EXP-00024的...

    Oracle init.ora 配置详解

    日志检查点超时参数定义了两次检查点之间的时间间隔。 ``` log_checkpoint_timeout = 1800 ``` 1800秒(即30分钟)的值是一个常见的选择,可根据实际负载情况进行调整。 #### 15. `processes` 该参数定义了数据库...

    一次简单的Oracle恢复Case实战记录

    接着,我们看到两个ORA-00600错误,这是Oracle数据库的一个内部错误代码,表示遇到了未预期的情况。错误参数中的[6856]和[4194]是特定的错误子类型,而其他参数可能与故障的具体位置或状态有关。这些错误通常需要...

    ORACLE常见错误代码的分析与解决二

    Oracle数据库在运行过程中可能会遇到各种错误,这些错误通常以错误代码的形式出现,便于开发者和管理员进行诊断和解决。本文将重点分析Oracle中的一个常见错误代码——ORA-01578,并提供相应的解决策略。 ORA-01578...

    Oracle坏块故障葵花宝典.docx

    在平湖地区的一次故障中,数据库出现了ORA-01578错误,具体表现为对表`ep_tablet`进行索引扫描时遇到问题。日志文件显示,出现问题的数据文件位于`D:\ORACLE\ORADATA\BS\USERS04.DBF` (文件号10, 块号2558610) 和`D:...

    Oracle11g 自动维护任务配置与调优

    2. **自动数据库诊断监控器 (ADDM):**基于AWR的数据,生成诊断报告,帮助识别性能瓶颈。 3. **自动任务调度程序 (Scheduler):**用于定义和管理维护任务的时间表。 #### 三、配置与调优步骤 ##### 1. 修改用户...

    Oracle_OCA_1Z0-052认证题库

    在题目中提到的 **ORA-01555: snapshot too old** 错误通常发生在事务处理高峰期,当一个查询运行时间过长,并且尝试读取的数据块已被其他事务修改多次时,就可能出现此错误。原因是 Oracle 数据库在执行查询时需要...

    真实世界Oracle故障诊断一千零一夜-2019数据技术嘉年华.pdf

    4. **补丁安装**:安装单次应用补丁(oneoff patch)可能会导致数据库实例无法启动,可能的原因包括数据库控制文件问题(ORA-210)、文件打开失败(ORA-17503)以及数据守护(dg)不存在(ORA-15001)。在安装补丁前...

Global site tag (gtag.js) - Google Analytics