Chinaunix首页 | 论坛 | 博客
  • 博客访问: 785927
  • 博文数量: 56
  • 博客积分: 451
  • 博客等级: 下士
  • 技术积分: 1431
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-20 11:14
文章分类

全部博文(56)

文章存档

2013年(35)

2012年(21)

分类: Oracle

2013-07-10 12:33:20

DBA_BLOCKERS displays a session if it is not waiting for a locked object but is holding a lock on an object for which another session is waiting.
通俗的翻译就是,它显示的是一个目前被自己占用的对象session,但同时另一个session也要使用这个对象。
下面我们通过演示来来理解这句话

1.建立一个表a,插入两条记录;

点击(此处)折叠或打开

  1. SQL> create table a (a1 number,a2 number);

  2. Table created.

  3. SQL> insert into a values(1,3456);

  4. 1 row created.

  5. SQL> insert into a values(2,4456);

  6. 1 row created.

  7. SQL> commit;

  8. Commit complete.
2.然后在一个窗口执行update语句:

点击(此处)折叠或打开

  1. SQL> update a set a2=80345 where a1=1;

  2. 1 row updated.
3.然后在另一窗口执行下列语句:

点击(此处)折叠或打开

  1. SQL> update a set a2=86979 where a1=1

可以看到一直在等待...........

解决这个问题有两种方法:

点击(此处)折叠或打开

  1. 1.在2语句执行的窗口中执行commit或者rollback语句
  2. 2.再开一个窗口,查找dba_blockers的session,然后杀掉

  3. 点击(此处)折叠或打开

    1. SQL> select * from dba_blockers;


    2. HOLDING_SESSION
    3. ---------------
    4.             139


    5. SQL> select sid,serial# from v$session where sid=139;


    6.        SID SERIAL#
    7. ---------- ----------
    8.        139 1190

    9. SQL> alter system kill session '139,1190'immediate;


    10. System altered.
    至此,问题解决。

不知道大家理解dba_blockers的功能了没有,有什么问题,都可以留言交流

阅读(2901) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~