Chinaunix首页 | 论坛 | 博客
  • 博客访问: 440243
  • 博文数量: 94
  • 博客积分: 3066
  • 博客等级: 中校
  • 技术积分: 908
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-25 17:10
文章分类

全部博文(94)

文章存档

2016年(3)

2015年(4)

2014年(1)

2013年(9)

2012年(8)

2011年(1)

2010年(8)

2009年(4)

2008年(2)

2007年(6)

2006年(48)

我的朋友

分类: Oracle

2006-04-21 13:33:33

查找被锁的表到底是哪一行被锁定了

有一个人问,所以总结了一下。
http://www.itpub.net/528153.html

简单的总结一下。

首先v$session中的这几个字段的含义分别为

row_wait_row#---被锁定行的rownum,但是准确的说是对应的于rowid的rownum,并非是单纯的rownum。下面再详细的说。
row_wait_obj#---row_wait_row#对应的rowid所在的表的object id。
row_wait_file#-- row_wait_row#对应的rowid所在的数据文件id
row_wait_block#--row_wait_row#对应的rowid所在的block的id

只有一个session等待另一个session的时候,这几个列的值才是有效的。

想要知道某一个表具体被锁定的是哪一行,可以利用上面这几个值,查找出被锁定行的rowid。
使用dbms_rowidb包的一个子过程(Subprograms)rowid_create

DBMS_ROWID.ROWID_CREATE (
rowid_type IN NUMBER,
object_number IN NUMBER,
relative_fno IN NUMBER,
block_number IN NUMBER,
row_number IN NUMBER)
RETURN ROWID;

其中rowid_type的取值为 0 表示生成一个restricted ROWID(pre-oracle8 format); 取值为1 表示生成一个extended ROWID.
object_number取值是dba_objects视图中的data_object_id,并不是object_id,也就是说不能用row_wait_obj#.
relative_fno取值是Relative文件号,在dba_data_files里可以查到,默认和file_id一致,也就是可以用row_wait_file#的值。
block_number取值是数据文件的块号,也就是v$session中的row_wait_block#的值
row_number通过rowid对应出来的rownum,也就是row_wait_row#的值。

通过使用
select DBMS_ROWID.ROWID_CREATE(1,data_object_id,relative_fno,row_wait_block#,row_wait_row#) from dual;

查找出的rowid即为被锁定的行。

如果有多行数据被锁定,row_wait_row#显示的是靠''前''的行。

代码:


16
:13:06 SQL> select * from test;



         
A          B          C

---------- ---------- ----------

       
600        600        600

       100        100        100

       100        100        100

       300        600        300

       100        100        100

       100        100        100

       500        500        500

       300        600        300

       100        100        100

       300        600        300

       100        100        100

       300        600        300

       500        500        500

       900        300        900



session1
;   update test set b=300 where a=900;

session2:   update test set b=300 where a=900;



16:12:14 SQL> select row_wait_file#,row_wait_obj#,row_wait_block#,row_wait_row# from v$session where username = 'TEST';



ROW_WAIT_FILE# ROW_WAIT_OBJ# ROW_WAIT_BLOCK# ROW_WAIT_ROW#

-------------- ------------- --------------- -------------

             
1            -1               0             0

             4          6728             178            21



16
:11:06 SQL> select data_object_id from dba_objects where object_id = 6728;



DATA_OBJECT_ID

--------------

          
6822



16
:12:34 SQL> select DBMS_ROWID.ROWID_CREATE(1,6822,4,178,21) from dual;



DBMS_ROWID.ROWID_C

------------------

AAABqmAAEAAAACyAAV



16
:12:51 SQL> select * from test where rowid = chartorowid('AAABqmAAEAAAACyAAV');



    
A          B       C

--------- ---------- ----------

900        300    900                          



16
:13:11 SQL>
阅读(1097) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~