`
m635674608
  • 浏览: 5053212 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

一个常见的ORA-00060死锁现象

 
阅读更多

在Oracle数据库中如果出现死锁现象,数据库就会报出ORA-00060的错误代号,这种死锁现象通常都是应用逻辑设计出错导致的异常,和oracle数据库本身的设计无关,现在通过实验模拟一个死锁现象
 
打开两个会话执行下列更新顺序
 
会话1:执行对employee_id为198的字段更新
HR@prod>update employees set first_name = 'cj' where employee_id = 198;
 
1 row updated.
 
会话2:执行对employee_id为200的字段更新
HR@prod>update employees set first_name = 'hh' where employee_id = 200;
 
1 row updated.
 
会话1:再执行对employee_id为200的字段更新,此时语句已经hang住,需要等待会话2发出commit或rollback动作。
HR@prod>update employees set first_name = 'cj' where employee_id = 200;
 
会话2:一旦执行更新,会话1就会马上报错。
HR@prod>update employees set first_name = 'sdf' where employee_id = 198;
 
update employees set first_name = 'cj' where employee_id = 200
         *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
 
会话2仍然hang住,查询alert日志发现报错:
ORA-00060: Deadlock detected. More info in file /u01/app/oracle/admin/prod/udump/prod_ora_4273.trc.
 
 通过dba_blockers表中的HOLDING_SESSION字段可以查询到hang住会话的ID
SYS@prod>select * from dba_blockers;
 
HOLDING_SESSION
---------------
            159
 
使用v$session视图获取hang住会话的sid和serial#
SYS@prod>select sid,serial#,username from v$session where sid in
  2  (select blocking_session from v$session);
 
       SID    SERIAL# USERNAME
---------- ---------- ------------------------------
       159          5 HR
 
找到hang住的会话后,执行alter system命令kill掉相应的session就可以了:
SYS@prod>alter system kill session '159,5' immediate;
 
System altered.
 
执行后会话1中的会话会自动被kill掉
会话1:
HR@prod>select employee_id,first_name from employees where rownum
select employee_id,first_name from employees where rownum
         *
ERROR at line 1:
ORA-03135: connection lost contact
 
会话2中执行查询发现会话2的更改生效。
HR@prod>select employee_id,first_name from employees where rownum
 
EMPLOYEE_ID FIRST_NAME
----------- --------------------
        198 sdf
        199 Douglas
        200 hh
        201 Michael
        202 Pat
        203 Susan
        204 Hermann
        205 Shelley
        206 William
        100 Steven
 
10 rows selected.
实际上,当出现死锁的情况,Oracle也会在一段时间后解锁。这种情况会在alert日志中记载下列信息:
ORA-00060: Deadlock detected. More info in file /u01/app/oracle/admin/ORCL/udump/orcl_ora_3173.trc.
本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-07/66890.htm

分享到:
评论

相关推荐

    ORACLE ORA错误大全

    在Oracle数据库管理与开发过程中,遇到ORA错误是非常常见的现象。这些错误通常提供了关于问题的具体位置和性质的重要线索,帮助数据库管理员(DBA)或开发者快速定位并解决问题。本文将对部分ORA错误进行详细解读,...

    oracle数据库解决死锁

    死锁是当多个事务在等待其他事务释放资源时,导致系统无法继续执行的现象。 在Oracle数据库中,死锁可能是由多种原因引起的,例如资源竞争、锁定冲突、事务延迟等。为了解决死锁问题,需要使用PL/SQL语句来检测和...

    Oracle所有错误

    #### ORA-00060:等待资源时检测到死锁 在资源争用过程中发现死锁现象。调整锁顺序或优化事务处理流程。 #### ORA-00061:另一个例程设置了不同的DML_LOCKS 当两个或更多例程尝试同时设置不同的DML_LOCKS值时触发。...

    Oracle数据库死锁查询语句

    你可以通过`ORA-00060`错误代码来识别死锁的发生。为避免死锁,设计良好的事务策略和适当的并发控制是关键。比如,可以采用以下策略: - 事务应尽可能短,减少持有锁的时间。 - 避免长时间的事务,特别是涉及多个...

    Oracle删除死锁进程的方法

    7. **死锁检测和避免策略**:Oracle数据库有内置的死锁检测机制,当检测到死锁时会自动回滚其中一个事务。此外,开发者可以利用数据库提供的工具和函数,如`DBMS_LOCK`包,来主动避免死锁的发生。 综上所述,Oracle...

    记录被另一个用户锁定.txt

    本文将详细介绍Oracle记录被另一个用户锁定的现象、原因以及相应的解决方法。 #### 1. 现象及原因分析 当遇到“记录被另一个用户锁定”的情况时,通常会观察到以下现象: - 在执行更新或删除操作时,事务长时间...

    Oracle EBS 开发笔记

    - **在一个FORM中调用不同的WINDOW**:实现多窗口操作,增强用户界面的灵活性。 - **Form假死锁问题之初步解决**:探讨并解决Form中可能出现的锁定问题。 - **FORM死锁解决**:提供具体的解决方案以避免或解除...

    数据库维护工作手册.docx

    - 定期检查是否存在死锁现象,一旦发现立即处理。 - **监控SQL语句的执行** - 监控关键SQL语句的执行情况,优化性能瓶颈。 - **操作系统级检查** - 对操作系统进行定期检查,确保系统层面无异常。 - **其他** - ...

    ORACLE紧急情况信息收集.docx

    - **现象**: 某个会话长时间占用大量资源,可能是因为死锁、资源竞争或程序逻辑问题。 - **排查步骤**: - 使用`v$session`或`gv$session`视图找到繁忙会话。 - 分析会话的等待事件(`v$session_wait`或`gv$session_...

    Oracle 9i&10g编程艺术:深入数据库体系结构 中文

    - **一种会失败的常用数据仓库技术**:说明了一种常见的数据仓库技术存在的问题。 - **解释热表上超出期望的I/O**:分析了热点数据导致的I/O问题及其解决方法。 - **7.4 写一致性**: - **一致读和当前读**:...

    ORACLE锁机制深入理解

    阻塞是并发操作中常见的现象,当一个会话持有另一个会话需要的资源锁时,会发生阻塞。这可能导致长时间的等待,甚至引发死锁,表现为ORA-60错误。为避免阻塞,Oracle提供了两种封锁策略:悲观封锁和乐观封锁。悲观...

Global site tag (gtag.js) - Google Analytics