在v$session视图中有四个字段,如下:

Wait information in v$session view
ROW_WAIT_OBJ# NUMBER Object ID for the table containing the row specified in ROW_WAIT_ROW#
ROW_WAIT_FILE# NUMBER

Identifier for the datafile containing the row specified in ROW_WAIT_ROW#.This column is valid only if the session is currently waiting for another transaction to commit and the value of ROW_WAIT_OBJ# is not -1.

ROW_WAIT_BLOCK# NUMBER

Identifier for the block containing the row specified in ROW_WAIT_ROW#.This column is valid only if the session is currently waiting for another transaction to commit and the value of ROW_WAIT_OBJ# is not -1.

ROW_WAIT_ROW# NUMBER Current row being locked. This column is valid only if the session is currently waiting for another transaction to commit and the value of ROW_WAIT_OBJ# is not -1

当我们在遭遇:enq: TX - row lock contention,这些等待事件时,可通过dbms_rowid.rowid_create(xx,xx,xx,xx,xx)来创建等待的数据行的rowid.

而在此要注意的是这个内建的procedure的第二个参数,先看下oracle 的doc对于dbms_rowid.rowid_create的解释:

BMS_ROWID.ROWID_CREATE (
rowid_type IN NUMBER,
object_number IN NUMBER,
relative_fno IN NUMBER,
block_number IN NUMBER,
row_number IN NUMBER)
参数:
rowid_type:rowid类型(restricted或者extended)。设置rowid_type为0时,代表restricted ROWID(此时,将忽略参数object_number):设置rowid_type为1时,代表extended ROWID。
object_number:数据对象编号(仅restricted类型rowid可用)。
relative_fno:所在数据文件编号。
block_number:该数据文件中的数据块编号。
row_number:在该块中的行编号。

第二个参数写的是object_number,而其解释中的是数据对象编号,其对应的应该是dba_objects中的data_object_id字段。如下:

SQL> desc dba_objects
名称 是否为空? 类型
----------------------------------------- -------- ------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)

一般而言,object_id是这个table在oracle中的对象编号,而data_object_id,指的是数据物理存放的对象编号,应该是段编号。通常情况下,这二者相等,当然分区表除外(分区表只有一个object_id,有多个data_object_id)。

当我们对table行truncate,move等操作的时候,可能就会引起二者不相等,如下例证:

SQL> drop table t1;
表已删除。
SQL> create table t1(id number);
表已创建。
SQL> col object_name for a20
SQL> select object_id,data_object_id,object_name from dba_objects where object_name='T1';
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- --------------------
52961 52961 T1

(1):此时t1是个空表,无数据,我们进行truncate操作。

SQL> truncate table t1;
表被截断。
SQL> select object_id,data_object_id,object_name from dba_objects where object_name='T1';
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- --------------------
52961 52961 T1

我们发现空表时进行truncate操作,object_id 和data_object_id仍然是相等的。

(2):插入数据,再次truncate

SQL> insert into t1(id) values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t1;
ID
----------
1
SQL> truncate table t1;
表被截断。
SQL> select object_id,data_object_id,object_name from dba_objects where object_name='T1';
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- --------------------
52961 52962 T1

此时,二者已经不相等了。下面测试move操作。

(3):表中无数据时进行move操作。

下面是使用dbms_rowid.rowid_create的一个例子

sys@JINGYONG> select rowid, t.*,dbms_rowid.rowid_relative_fno(rowid) relative_fno ,
2 dbms_rowid.rowid_object(rowid) object_number ,
3 dbms_rowid.rowid_block_number(rowid) block_number ,
4 dbms_rowid.rowid_row_number(rowid) row_number
5 from t where rownum<; ROWID ID TEXT RELATIVE_FNO OBJECT_NUMBER BLOCK_NUMBER ROW_NUMBER
------------------ ---------- ------------------------------ ------------ ------------- ------------ ----------
AAANB1AABAAAPAaAAA 20 ICOL$ 1 53365 61466 0 sys@JINGYONG> select data_object_id from dba_objects where object_id=53365; DATA_OBJECT_ID
--------------
53365 sys@JINGYONG> select dbms_rowid.rowid_create(1,53365,1,61466,0) create_rowid fr
om dual; CREATE_ROWID
------------------
AAANB1AABAAAPAaAAA

通过dbms_rowid.rowid_create(1,53365,1,61466,0)构造的rowid与原始的rowid是一样的.
参数的意思:

1表示rowid的类型为扩展rowid,类型为1;

data_object_id 为53365,也就是文中t表对象的id;

数据文件id为1 ,即system表空间文件;

块的编号为61466号; 行数为第一行(第一行为值0) 。

通过dbms_rowid.rowid_create函数查询被锁定的具体行
查询被锁的会话和持有锁的会话,如果是exclusive锁则xidusn非零的表示已经执行并持有锁

column o_name format a10
column lock_type format a20
column object_name format a15
select rpad(oracle_username,10) o_name,
session_id sid,
decode(locked_mode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_type,
object_name,
all_objects.object_id,
xidusn,
xidslot,
xidsqn
from v$locked_object,all_objects
where v$locked_object.object_id=all_objects.object_id;
O_NAME SID LOCK_TYPE OBJECT_NAME OBJECT_ID XIDUSN XIDSLOT XIDSQN
---------- ------- -------------------- --------------- -------------- ---------- ------------ ----------
SYS 145 Row Exclusive T 53365 8 17 724
SYS 148 Row Exclusive T 53365 0 0 0

下面的查询可以得到被锁定的session,被锁定的对象id和row number

select sid,
row_wait_obj# object_id,
row_wait_file# file_no,
row_wait_block# block,
row_wait_row# row_num
from v$session
where row_wait_obj#=&object_id;
Enter value for object_id: 53365
old 7: where row_wait_obj#=&object_id
new 7: where row_wait_obj#=53365
SID OBJECT_ID FILE_NO BLOCK ROW_NUM
---------- -------------- ---------- ---------- ----------
148 51207 1 61466 0

如果要对应行rowid则:

sys@JINGYONG>  select dbms_rowid.rowid_create(1,53365,1,61466,0) create_rowid from dual;

CREATE_ROWID
------------------
AAANB1AABAAAPAaAAA

有了rowid,具体的行就能定位了

利用DBMS_ROWID.ROWID_CREATE来找出事务等待的行数据的更多相关文章

  1. 如何在数据表当中找出被删掉的数据行ID

    这个问题是一年前我刚步入IT行业的一个面试题,当时抓破头皮都想不到的问题,但现在回想过去自身不禁感到可笑,不多扯直接写解决方案.如何在数据表当中找出被删掉的数据行ID,意思是:在一堆的数据当中,让你找 ...

  2. 利用PHP扩展Taint找出网站的潜在安全漏洞实践

    一.背景 笔者从接触计算机后就对网络安全一直比较感兴趣,在做PHP开发后对web安全一直比较关注,2016时无意中发现Taint这个扩展,体验之后发现确实好用:不过当时在查询相关资料时候发现关注此扩展 ...

  3. 找出诡异的Bug:数据怎么存不进去

    带着学生做课程设计.程序一大,课程中做过了小项目,练过了分解动作,一到合起来了,难免还是要乱了分寸.事实上,实战的功夫,就是这样出来的.(课程设计指导视频链接(第36课时,3.18 银行系统开发).课 ...

  4. python——快速找出两个电子表中数据的差异

    最近刚接触python,找点小任务来练练手,希望自己在实践中不断的锻炼自己解决问题的能力. 公司里会有这样的场景:有一张电子表格的内容由两三个部门或者更多的部门用到,这些员工会在维护这些表格中不定期的 ...

  5. C# 把带有父子关系的数据转化为------树形结构的数据 ,以及 找出父子级关系的数据中里面的根数据Id

    紧接上一篇,将List<Menu>的扁平结构数据, 转换成树形结构的数据 返回给前端   ,   废话不多说,开撸! --------------------- 步骤: 1. 建 Menu ...

  6. 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

    今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...

  7. MySQL找出锁等待

    1.服务器级别的锁等待 可以通过show processlist看到等待锁的线程id,但是无法知道究竟哪个线程持有锁 可以通过mysqladmin debug 相关等待锁的线程以及谁持有锁可以在错误日 ...

  8. 转:已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

    答案: int max(int a,int b){return (a+b+abs(a-b))/2;} 类似的 请定义一个宏,比较两个数a.b的大小,不能使用大于.小于.if语句 答案: #define ...

  9. 数据库中通过group by找出表中的重复数据

    有时候在做数据割接时会碰到数据插入失败的情况,大部分都是导出的数据中存在重复导致的.我们可以通过查询语句带分组条件来确认是否有重复数据.例如我现在有表 t_wlf_info,其中有个 username ...

随机推荐

  1. StereoBM::disp12MaxDiff Crash the Release

    Initializing "cv::StereoBM bm.state->disp12MaxDiff" should be careful, inappropriate va ...

  2. npm 国内淘宝镜像cnpm

    某些插件很奇怪,需要用国内的镜像下载才可以 #安装淘宝镜像npm install cnpm -g --registry=https://registry.npm.taobao.org #使用淘宝镜像下 ...

  3. Description of security events in Windows 2003/7/2008

    https://technet.microsoft.com/library/cc163121.aspx#EKH https://support.microsoft.com/en-us/kb/97751 ...

  4. 结合计划任务每天从Symantec官网下载离线病毒库

    #三种方法,由初级到高级 $numbers = 1..40 | Foreach {"{0:D3}" -f $_} #将数字类型格式化并转换为字符串类型使用-f字符串操作符 ForE ...

  5. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. Apache Spark源码走读之5 -- DStream处理的容错性分析

    欢迎转载,转载请注明出处,徽沪一郎,谢谢. 在流数据的处理过程中,为了保证处理结果的可信度(不能多算,也不能漏算),需要做到对所有的输入数据有且仅有一次处理.在Spark Streaming的处理机制 ...

  7. 简单排序算法 C++类实现

    简单排序算法: 冒泡排序 插入排序 选择排序 .h代码: // // SortClass.h // sort and selection // // Created by wasdns on 16/1 ...

  8. The P4 Language Specification v1.0.2 Header and Fields

    前言 本文参考P4.org网站给出的<The P4 Language Specification v1.0.2>的第二部分首部及字段,仅供学习:). 欢迎交流! Header and Fi ...

  9. Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)

    主要函数: filetype() 判断文件类型 filesize() 得到文件大小(字节) is_readable() 判断文件是否可读 is_writeable() 判断文件是否可写 is_exec ...

  10. Android TextView 显示不全的自动补齐方式

    TextView在Android开发中用到的地方应该是很多的.很多时候,TextView会有一行显示不全被截取或者会换行.之前我的解决办法比较笨拙,定死TextView的一行字数长度,最后一个以省略号 ...