如何找出被鎖定的行

space6212發表於2019-07-20

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章