如何找出被锁定的行

上一篇 / 下一篇  2007-02-06 00:00:00 / 个人分类:Oracle技术

oracle锁的最小单元是行,oracle在锁定记录的时候直接在对应的行做一个标识,但我们并不能通过视图查询出被锁的行。(想想道理也很简单,如果每一个被锁的行对应一条记录,那么在大数据量更新的数据库是不可接受的)。
但是,我们可以通过其他方式查询出被锁的行。



v$sesion中有ROW_WAIT_OBJ#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,ROW_WAIT_FILE#,可以帮助我们来确定被锁的行。
其中:
ROW_WAIT_OBJ#:对应dba_objects的data_object_id
ROW_WAIT_BLOCK#:被锁住行所在block id
ROW_WAIT_ROW#:被锁住行的行号
ROW_WAIT_FILE#:对应v$datafile的rfile#

下面通过一个例子来说明如何找出被锁住的行。

SQL> select id,rowid from f;

ID ROWID
---------- ------------------
2 AAADQHAAUAAAxDfAAA
12 AAADQHAAUAAAxDfAAB

会话一、
SQL> update f set id=2 where id=2;

1 row updated

会话二、
SQL> @show_sid

SID
----------
22

SQL> update f set id=2 where id=2;
此时会话二被阻塞。用下面的SQL找出被阻塞的行。

SQL> select dbms_rowid.rowid_create(1,data_object_id,rfile#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#) "rowid"
2 from v$session,dba_objects,v$datafile
3 where sid=22 and ROW_WAIT_OBJ#=object_id and file#=ROW_WAIT_FILE#
4 ;

rowid
------------------
AAADQHAAUAAAxDfAAA

可以看出,找出的rowid就是被更新的rowid。

这里注意几点:
1、ROW_WAIT_OBJ#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,ROW_WAIT_FILE#的数值只在被阻塞的会话是有效的
2、如果更新多行,则ROW_WAIT_OBJ#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,ROW_WAIT_FILE#对应的是第一个被阻塞的行的信息

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-01-26  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 449
  • 日志数: 398
  • 建立时间: 2007-12-30
  • 更新时间: 2008-01-22

RSS订阅

Open Toolbar