• Oracle死锁


    当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 deadlock detected while waiting for resource

    oracle编程艺术上面提过,死锁的两种原因:外键未加索引,位图索引并发。

    外键无索引导致死锁:

    oracle在更新主表的时候,会去寻找所有以主表的主键作为外键的数据表,然后看从表是否有该外键的索引,如果没有则会对整个从表施加表级锁,然后对从表进行全表扫描。当然如果从表存在外键的索引,会去访问对应的索引,而不会对从表本身进行加锁。

    位图索引并发导致死锁:

    位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),
    索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,
    位置编码中的每一位表示键值对应的数据行的有无.一个位图索引块可能指向的是几十甚至成百上千行数据的位置.

    创建语法很简单,就是在普通索引创建的语法中index前加关键字bitmap即可,例如:
    create bitmap index H病人挂号记录_ix_执行人 on H病人挂号记录(执行人);

    位图索引由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定。

    另外,自治事务也可能会引起死锁。

    死锁处理。

    查看锁表进程

    select l.os_user_name, l.oracle_username, object_name, o.object_type,
           o.created, s.program, s.sid, s.serial#, p.spid
      from v$locked_object l, dba_objects o, v$session s, v$process p
    where l.object_id = o.object_id
       and l.session_id = s.sid
       and s.paddr = p.addr;

    杀掉锁表进程方法一:

    alter system kill session 'sid,serial#';

    如果利用上面的杀掉锁表进程方法一杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
    select spid, osuser, s.program
    from v$session s,v$process p
    where s.paddr=p.addr and s.sid=234 (234是上面的sid)
    在OS上杀死这个进程(线程):
    1)在unix上,用root身份执行命令:
    #kill -9 12345(即第3步查询出的spid)
    2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
    orakill sid thread
    其中:
    sid:表示要杀死的进程属于的实例名
    thread:是要杀掉的线程号,即第3步查询出的spid。
    例:c:>orakill orcl 12345

  • 相关阅读:
    zTree 优秀的jquery树插件
    The underlying provider failed on open 问题解决
    HTML 5 <input> list 属性
    C#拖曳控件加载,bll报错问题
    把VS2010的智能代码提示和注解从英文变成中文
    progressBar的使用
    C++内存读写例子
    bash 管理小脚本
    KVM虚拟机配置笔记
    Ettercap 实施中间人攻击
  • 原文地址:https://www.cnblogs.com/mellowsmile/p/4723494.html
Copyright © 2020-2023  润新知