zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL Server CHARINDEX和PATINDEX详解
    MVC ListBoxFor raises “value cannot be null” exception
    jquery.uploadify动态传递表单元素
    C# 判断一字符串是否为合法数字(正则表达式)
    jquery 操作Listbox
    JQuery 操作 ListBox间移动和ListBox内移动
    jQuery获取Select选择的Text和 Value
    SQL 语句的执行效率
    JSON 序列化长度限制问题
    C#中利用FileSystemWatcher对单个文件内容的监视
  • 原文地址:https://www.cnblogs.com/mellowsmile/p/4723494.html
Copyright © 2011-2022 走看看