`

Oracle高级应用之解锁表

    博客分类:
  • db
 
阅读更多

每篇一笑:老鼠去方便,见熊也在,吓得不吭声,熊看了眼老鼠说:你掉不掉毛?老鼠哆嗦不语,熊又问:掉不掉毛?老鼠说:不掉!熊抓住老鼠擦擦屁股走了。

锁机制用于管理对共享资源的并发访问。注意,我说的是“共享资源”而不是“数据库行”。Oracle会在行级别对表数据锁定,这固然不错,不过Oracle也会在其他多个级别上使用锁,从而对多种不同的资源提供并发访问。
如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会出现死锁。例如,如果数据库中有两个表A和B,每个表中都只有一行,就可以很容易地展示什 么是死锁。要做的只是打开两个会话。在会话A中更新表A,并在会话B中更新表B。现在,如果想在会话B中更新表A,就会阻塞。会话A已经锁定了这一行。这 不是死锁,只是阻塞而已。我还没有遇到过死锁,因为会话A还有机会提交或回滚,这样会话B就能继续了。
1.查看当前系统中锁表情况的SQL如下:

  1. select * from v$locked_object  

2.可以通过查询v$locked_object拿到sid和objectid,然后用sid和v$session链表查询是哪里锁的表,用v$session中的objectid字段和dba_objects的id字段关联,查询详细的锁表情况的SQL如下:

  1. select sess.sid,  
  2.        sess.serial#,  
  3.        lo.oracle_username,  
  4.        lo.os_user_name,  
  5.        ao.object_name,  
  6.        lo.locked_mode  
  7.   from v$locked_object lo, dba_objects ao, v$session sess, v$process p  
  8. where ao.object_id = lo.object_id  
  9.    and lo.session_id = sess.sid  

3.查询是什么引起了锁表的原因的SQL如下:

  1. select l.session_id sid,  
  2.        s.serial#,  
  3.        l.locked_mode,  
  4.        l.oracle_username,  
  5.        s.user#,  
  6.        l.os_user_name,  
  7.        s.machine,  
  8.        s.terminal,  
  9.        a.sql_text,  
  10.        a.action  
  11.   from v$sqlarea a, v$session s, v$locked_object l  
  12. where l.session_id = s.sid  
  13.    and s.prev_sql_addr = a.address  
  14. order by sid, s.serial#  

4.解锁的SQL如下:

 

  1. alter system kill session 'sid,serial#' 

原文地址:http://blog.csdn.net/fu0208/article/details/9818109

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics