ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 如何找出被锁定的行

如何找出被锁定的行

原创 Linux操作系统 作者:space6212 时间:2019-07-20 10:33:02 0 删除 编辑

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#对应的是第一个被阻塞的行的信息

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63786/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 索引存储小记
请登录后发表评论 登录
全部评论

注册时间:2005-01-25

  • 博文量
    245
  • 访问量
    168880