如何找出被锁定的行
上一篇 /
下一篇 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: