记一次锁表的处理(定位锁的原因及处理)

     在ORACLE中,常常会碰到锁阻塞的问题,这时候 我们就需要 利用ORALCE的给的相关视图查出并定位锁的原因  然后根据业务或者其他的实际情况进行业务上的调整或者代码或参数的修改等


-------1、首先查出阻塞的关系。  (哪个会话阻塞了哪个会话)

select a.sid holdsid,b.sid waitsid,a.type ,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block = 1 and b.block = 0 ;


-------2、查询出数据库中锁表的信息。 (根据 1 中查出的会话进行对比 看是哪个表被锁住了。)




select sess.sid, 
    sess.serial#, 
    lo.oracle_username, 
    lo.os_user_name, 
    ao.object_name, 
    lo.locked_mode 
    from v$locked_object lo, 
    dba_objects ao, 
    v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid;


------3、查询出造成阻塞的SQL (根据 1/2 查出的会话 信息以及 表信息 进行对比 看是哪条SQL造成的锁)


select l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       s.user#,
       l.os_user_name,
       s.machine,
       s.terminal,
       a.sql_text,
       a.action
  from v$sqlarea a, v$session s, v$locked_object l
where l.session_id = s.sid
   and s.prev_sql_addr = a.address
order by sid, s.serial#;


-------4、根据 1 中阻塞的会话 查出这个锁的信息。
select sid,type,id1,id2,lmode,request,block from v$lock where sid in(,) order by sid;

你可能感兴趣的:(SQL,ora记录)