• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    简单说明Oracle数据库中对死锁的查询及解决方法

    死锁的原理
    当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
    交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
    此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。 
     
    死锁的定位方法
    通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
     
    1)用dba用户执行以下语句

    select username,lockwait,status,machine,program from v$session where sid in 
    (select session_id from v$locked_object) 
    

    如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:

     
    2)用dba用户执行以下语句,可以查看到被死锁的语句。

    select sql_text from v$sql where hash_value in 
    (select sql_hash_value from v$session where sid in 
    (select session_id from v$locked_object))
    

    死锁的解决例子
    死锁在Oracle中处理时,会自动事务相关的DML语句撤销。换句话说,就是Oracle对于死锁 问题的处理时一个主动的过程,会主动切断其中一个session的事务锁。

    先来看一个简单的死锁案例。

    我们创建两个表lock_test1,lock_test2,然后使用两个session来说明。

    session1:

    首先在session1中先创建两个表,lock_test1,lock_test2

    n1@TEST11G> create table lock_test1 as select *from cat;
    
    Table created.
    
    n1@TEST11G> create table lock_test2 as select *from cat;                     
    
    Table created.
    
    

    然后尝试对lock_test1做delete操作。

    n1@TEST11G> delete from lock_test1;
    
    20 rows deleted.
    
    

    session2:

    然后切换到session2,对lock_test2做delete操作。

    n1@TEST11G> delete from lock_test2;
    
    21 rows deleted.
    
    

    紧接着,在session1中对lock_test2做delete操作,这个时候出现阻塞的情况,一直没有响应。

    session1:

    n1@TEST11G> delete from lock_test2;
    
    

     

    我们在session2中,继续对表Lock_test1做delete操作,这个时候会有短暂的停顿,就会发现session1中的事务被强行撤销了。

    session2:

    n1@TEST11G> delete from lock_test1;
    
    

    session1中的日志如下,可以看到这个时候session1中的事务被强行撤销了。

    n1@TEST11G> delete from lock_test2;
    
    delete from lock_test2
    
          *
    
    ERROR at line 1:
    
    ORA-00060: deadlock detected while waiting for resource
    
    

    这个问题可以简单用下面的步骤来说明。

    到此为止我们可以看到,死锁产生的影响是很大的,当然,问题还不止于此,在多个表之间很可能存在死锁现象,对于一个表,也有可能出现死锁现象。

    我们来简单说明示例一下。

    session1:

    create table test as select *from user_tables;
    
    n1@TEST11G> delete from test where table_name='LOCK_TEST1';
    
    1 row deleted.
    
    

    session2:

    n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2';
    
    1 row deleted.
    
    session1:
    
    n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2';
    
    

    session2:

    n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST1';
    
    

    这个时候还是会出现一样的死锁问题,这个时候在对应的行上会有相应的锁。在session2中会有短暂的停顿,然后把session1中的

    给撤销了,产生的日志如下:

    DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2'
    
     *
    
    ERROR at line 1:
    
    ORA-00060: deadlock detected while waiting for resource
    
    

    可见死锁的问题还是很容易产生的,在编程中处理多并发的处理时还是需要多多注意。

    您可能感兴趣的文章:
    • Oracle 查询死锁并解锁的终极处理方法
    • 讲解Oracle数据库中结束死锁进程的一般方法
    • Oracle数据表中的死锁情况解决方法
    • oracle 会话 死锁 执行sql 执行job的方法
    • Oracle删除死锁进程的方法
    • Oracle对于死锁的处理方法
    • Oracle外键不加索引引起死锁示例
    • Oracle 死锁的检测查询及处理
    上一篇:Oracle数据库中外键的相关操作整理
    下一篇:Oracle数据表中的死锁情况解决方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    简单说明Oracle数据库中对死锁的查询及解决方法 简单,说明,Oracle,数据库,