`
xwood
  • 浏览: 100671 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ORA数据库解锁

阅读更多
一.查询锁基本信息:
select a.object_name, --被锁的资源
       dd.*
from (
  select a.sid,
         'Wait' "Status", --/*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */  LOCK表明该进程锁住了某个资源,WAIT表示该进程正在等待某个资源
         a.username, --ORACLE用户名
         a.machine, --ORACLE机器
         a.serial#, 
         a.last_call_et "Time", --表示该进程最后一次进行操作至当前的时间(秒)
         a.program, --产生死锁的语句主要来自哪个应用程序
         a.command,
         a.lockwait, --死锁的状态,如果有内容表示被死锁
         b.id1, --锁标识。某个LOCK状态的ID1与某个WAIT状态的ID1相同,可说明锁的正是另一个进程等待的。
         c.sql_text "SQL" -- 锁住资源的SQL语句
  from v$session a, v$lock b, v$sqltext c
  where a.username is not null
        and a.lockwait = b.kaddr
        and c.hash_value =a.sql_hash_value
  union
  select a.sid,
         'Lock' "Status", --/*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ 
         a.username, 
         a.machine, 
         a.serial#, 
         a.last_call_et "Time", 
         a.program,
         a.command,
         a.lockwait,
         b.id1, 
         c.sql_text "SQL"
  from v$session a, v$lock b, v$sqltext c
  where b.id1 in
        (
          select distinct e.id1 -- /*+ NO_MERGE(d) NO_MERGE(e) */
          from v$session d, v$lock e
          where d.lockwait = e.kaddr
        )
        and a.username is not null
        and a.sid = b.sid
        and b.request=0
        and c.hash_value =a.sql_hash_value
) dd 
left join v$locked_object o on dd.sid = o.session_id
left join all_objects a on o.object_id = a.object_id 

注:NO_MERGE()保证视图的查询不被拆散。这是防止CBO在设计执行方案时将Oracle优化过的视图拆分。以保证执行效率。
二.解锁:
alter system kill session 'sid,serial#';


三.原因分析

1.由于外键原因导致的表级锁
    当在一个session中对从表进行update,insert或delete操作时,oracle会默认对从表数据施加行级锁,而与此同时,如果在另一个session中对主表进行delete操作,oracle便会寻找所有以主表ID为FK的从表,然后看该从表是否有该外键的索引。如果有,则访问索引,如果没有,则对从表施加表级锁,然后对全表进行扫描。
    解决办法:为从表的外键建立索引,这也是在使用外键时的推荐方式。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics