当前位置:  数据库>oracle

使用DBMS_ROWID获取被阻塞行的rowid

    来源: 互联网  发布时间:2017-06-27

    本文导语: 在使用v$session视图在查询会话的行锁的等待事件时,视图中提供了会话等待的对象号(ROW_WAIT_OBJ#)、文件号(ROW_WAIT_FILE#)、块号(ROW_WAIT_BLOCK#)和行号(ROW_WAIT_ROW#)但是如何使用这些信息定位出会话等待的是哪一行呢?答案就是使用DBMS_R...

在使用v$session视图在查询会话的行锁的等待事件时,视图中提供了会话等待的对象号(ROW_WAIT_OBJ#)、文件号(ROW_WAIT_FILE#)、块号(ROW_WAIT_BLOCK#)和行号(ROW_WAIT_ROW#)但是如何使用这些信息定位出会话等待的是哪一行呢?答案就是使用DBMS_ROWID

打开两个会话同时更新同一条数据

#session 1
linuxidc@ORCL>select distinct sid from v$mystat;
 
      SID
----------
    22
 
linuxidc@ORCL>
zx@ORCL>update zx set name='zx' where id=1;
 
1 row updated.
 
#session 2
linuxidc@ORCL>select distinct sid from v$mystat;
 
      SID
----------
      145
       
linuxidc@ORCL>update zx set name='zx' where id=1;

此时session2会被session1阻塞,查询v$session会话145在等待enq: TX - row lock contention

linuxidc@ORCL>col event for a40
linuxidc@ORCL>select SID,EVENT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW# from v$session where sid=145;
 
      SID EVENT                    ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
---------- ---------------------------------------- ------------- -------------- --------------- -------------
      145 enq: TX - row lock contention          99754        18    15571      7

查询v$lock确认会话145在请求会话22的TX锁

linuxidc@ORCL>select sid,type,id1,id2,lmode,request from v$lock where sid=145 or sid=22 order by 1;
 
      SID TYPE    ID1      ID2      LMODE    REQUEST
---------- ------ ---------- ---------- ---------- ----------
    22 AE      100        0  4    0
    22 TM        99754      0  3    0
    22 TX      4390915      581    6    0
      145 TM          99754      0  3    0
      145 TX        4390915      581    0    6
      145 AE        100        0  4    0

使用如下语句查询会话145等待哪个表的哪个行

linuxidc@ORCL>col owner for a10
linuxidc@ORCL>col object_name for a10
linuxidc@ORCL>col rowid for a30
linuxidc@ORCL>select b.owner,b.object_name,dbms_rowid.rowid_create(1,s.ROW_WAIT_OBJ#,s.ROW_WAIT_FILE#,s.ROW_WAIT_BLOCK#,ROW_WAIT_ROW#) "rowid" from v$session s,dba_objects b where s.ROW_WAIT_OBJ#=b.object_id and s.si
d=145;
OWNER      OBJECT_NAM rowid
---------- ---------- ------------------------------
ZX    ZX          AAAYWqAASAAADzTAAH
--使用上面查询出的rowid查看数据,即为session2等待的行
linuxidc@ORCL>select * from zx.zx where rowid='AAAYWqAASAAADzTAAH';
 
    ID NAME
---------- ------------------------------
    1 ZX

官方文档:http://docs.Oracle.com/cd/E11882_01/appdev.112/e40758/d_rowid.htm#ARPLS053

使用下面语句查找会话之间的阻塞关系

 SELECT ('节点' || a.inst_id || ' session ' || a.sid || ',' || a_s.serial# ||
      '阻塞了节点' || b.inst_id || ' session ' || b.sid || ',' || b_s.serial#) blockinfo,
      a.inst_id,
      a_s.sid,
      a_s.schemaname,
      a_s.module,
      a_s.status,
      a_s.event,
      a.type lock_type,
      a.id1,
      a.id2,
      decode(a.lmode,
              0,
              'none',
              1,
              NULL,
              2,
              'row-S(SS)',
              3,
              'row-X(SX)',
              4,
              'share(S)',
              5,
              'S/Row-X(SSX)',
              6,
              'exclusive(X)') lock_mode,
      a.ctime time_hold,
      '后为被阻塞信息' remark_flag,
      b.inst_id blocked_inst_id,
      b.sid blocked_sid,
      b.type blocked_lock_type,
      decode(b.request,
              0,
              'none',
              1,
              NULL,
              2,
              'row-S(SS)',
              3,
              'row-X(SX)',
              4,
              'share(S)',
              5,
              'S/Row-X(SSX)',
              6,
              'exclusive(X)') blocked_lock_request,
      b.ctime time_wait,
      b_s.schemaname blocked_schemaname,
      b_s.module blocked_module,
      b_s.status blocked_status,
      b_s.sql_id blocked_sql_id,
      b_s.event,
      obj.owner blocked_owner,
      obj.object_name blocked_name,
      obj.object_type blocked_object_type,
      CASE
        WHEN b_s.row_wait_obj# -1 THEN
          dbms_rowid.rowid_create(1,
                                  obj.data_object_id,
                                  b_s.row_wait_file#,
                                  b_s.row_wait_block#,
                                  b_s.row_wait_row#)
        ELSE
          '-1'
      END blocked_rowid, --被阻塞数据的rowid
      decode(obj.object_type,
              'TABLE',
              'select * from ' || obj.owner || '.' || obj.object_name ||
              ' where rowid=''' ||
              dbms_rowid.rowid_create(1,
                                      obj.data_object_id,
                                      b_s.row_wait_file#,
                                      b_s.row_wait_block#,
                                      b_s.row_wait_row#) || '''',
              NULL) blocked_data_querysql
  FROM gv$lock    a,
      gv$lock    b,
      gv$session  a_s,
      gv$session  b_s,
      dba_objects obj
 WHERE a.id1 = b.id1
  AND a.id2 = b.id2
  AND a.block > 0 --阻塞了其他人
  AND b.request > 0 --AND ((a.INST_ID=b.INST_ID AND a.SIDb.SID) OR (a.INST_IDb.INST_ID ))
  AND a.sid = a_s.sid
  AND a.inst_id = a_s.inst_id
  AND b.sid = b_s.sid
  AND b.inst_id = b_s.inst_id
  AND b_s.row_wait_obj# = obj.object_id(+)
 ORDER BY a.inst_id, a.sid;


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux不用命令方式读文件获取网络流量,如何使用C函数调用获取网络流量信息?
  • 急,,,怎样获取远程系统的CPU和内存使用率
  • curl不使用文件存取cookie php使用curl获取cookie示例
  • 怎么写个CGI程序获取远程linux主机的信息,如cpu使用率,内存使用等?
  • 如何获取客户端浏览器所使用的语言,特别是要区分简繁体!
  • 使用ps命令,如何使用系统命令根据进程名称获取进程和子进程的ID?除了ps,还有其它系统命令的办法吗?谢谢。
  • 使用Jquery获取带特殊符号的ID 标签的方法
  • sql server 使用ntile获取数据的例子
  • c语言在unix系统下,如何获取cpu使用率
  • hp_ux下如何使用java获取top信息
  • 怎样使用FTP递归获取文件夹下的所有文件及子文件夹?
  • [求助]如何获取一个程序所使用的系统调用和参数?
  • jquery使用$(element).is()来判断获取的tagName
  • ASP.NET使用Subtract方法获取两个日期之间的天数
  • 哪位编程高手知道如何编程实现获取进程的内存使用量信息(linux)
  • 多网卡多IP情况下如何通过脚本获取当前登录终端使用的ip?
  • 使用标准SAX解析XML文档如何获取文档编码信息及约束它的dtd文件路径.
  • linux中,获取系统的CPU、内存、硬盘使用情况该用什么函数?
  • 如何使用c语言获取当前系统的时间,就是那个秒数?
  • 请问,怎样通过程序方式,获取AIX系统当前的CPU, 内存使用情况?
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3