热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle中锁定行的查找方法

锁定行的查找要查找session锁定的行,可以有两种方式:1.通过v$session中的row_wait_row#查询setserveroutonsize1000000set

锁定行的查找

 

要查找session锁定的行,可以有两种方式:

1.       通过v$session中的row_wait_row#查询

set serverout on size 1000000

set lines 132

declare

  cursor cur_lock is

         select sid,id1,id2,inst_id, ctime

           from gv$lock

          where block = 1;

  vid1       number;

  vid2       number;

  cursor cur_locked is

         select sid, inst_id, ctime

           from gv$lock

          where id1 = vid1

            and id2 = vid2

            and block <> 1;

  vlocks     varchar2(30);

  vsid1      number;

  vobj1      number;

  vfil1      number;

  vblo1      number;

  vrow1      number;

  vrowid1    varchar2(20);

  vcli1      varchar2(64);

  vobj2      number;

  vfil2      number;

  vblo2      number;

  vrow2      number;

  vrowid2    varchar2(20);

  vcli2      varchar2(64);

  vobjname   varchar2(30);

  vlocked    varchar2(30);

  ctim1      number;

  ctim2      number;

begin

dbms_output.put_line('=====================================================');

dbms_output.put_line('Blocking lock list.');

dbms_output.put_line('=====================================================');

dbms_output.put_line('Block / Is blocked         SID        INST_ID OBJECT                         TIME(secs) ROWID              CLIENT_IDENTIFIER');

dbms_output.put_line('-------------------------  ---------  ------- ------------------------------ ---------- ------------------ -----------------');

  for c1 in cur_lock loop

      vid1 := c1.id1;

      vid2 := c1.id2;

      select username,sid,row_wait_obj#,row_wait_file#,row_wait_block#,row_wait_row#,client_identifier

                 into vlocks,vsid1,vobj1,vfil1,vblo1,vrow1,vcli1

                 from gv$session where sid = c1.sid and inst_id = c1.inst_id;

      if vobj1 = -1 then

         vobjname := 'UNKNOWN';

      else

         select name into vobjname from sys.obj$ where obj# = vobj1;

         select decode(vrow1,0,'MANY ROWS',dbms_rowid.rowid_create(1, vobj1, vfil1, vblo1, vrow1)) into vrowid1 from dual;

      end if;

      dbms_output.put_line(rpad(vlocks,25) || ' ' ||

                           to_char(vsid1,'999999999') || ' ' ||

                           to_char(c1.inst_id,'9999999') || ' ' ||

                           rpad(vobjname,30) || ' ' ||

                           to_char(c1.ctime,'999999999') || ' ' || rpad(vrowid1,18) || ' ' || vcli1);

      for c2 in cur_locked loop

          select username, row_wait_obj#,row_wait_file#,row_wait_block#,row_wait_row#

            into vlocked, vobj2, vfil2, vblo2, vrow2

            from gv$session where sid = c2.sid and inst_id = c2.inst_id;

          if vobj2 = -1 then

             vobjname := 'UNKNOWN';

          else

             select name into vobjname from sys.obj$ where obj# = vobj2;

             select decode(vrow2,0,'MANY ROWS',dbms_rowid.rowid_create(1, vobj2, vfil2, vblo2, vrow2)) into vrowid2 from dual;

          end if;

          dbms_output.put_line(chr(9) || '--> ' || rpad(vlocked,12) || ' ' ||

                 to_char(c2.sid,'999999999') || ' ' ||

                 to_char(c2.inst_id,'9999999') || ' ' || rpad(vobjname,30) || ' ' ||

                 to_char(c2.ctime,'999999999') || ' ' || rpad(vrowid2,18) || ' ' || vcli2 ) ;

      end loop;

  end loop;

commit;

end;

 

 

这种查询方式的局限是只能查询出来一行,如果是多行,则row_wait_row#返回的是锁定的开始行。

 

2.       通过for update查询所有加锁行

create or replace procedure locksmith(table_name varchar2) is
  type tabcurtype is ref cursor;
  type tabrowstype is table of varchar2(
50) index by binary_integer;
  table_cursor tabcurtype;
  rowid_table  tabrowstype;
  row_id       rowid;
  status       number;
  aud_sid      number;
  test_sid     number;
  test_serial  number;
  locker_sid   number;
  locker_name  varchar2(
1000);
  message      varchar2(
1000);

  resource_busy exception;
  pragma exception_init(resource_busy, -
54);

begin
  rowid_table(
0) := '0';
  dbms_output.enable(
1000000);
  open table_cursor for
'select rowid from ' || table_name;
  loop
    begin
      fetch table_cursor
        into row_id;
      exit when table_cursor%notfound;
      savepoint one_register;
      execute immediate
'select 1 from ' || table_name ||
                       
' where rowid =:r for update nowait'
        using row_id;
    exception
      when resource_busy then
        rowid_table(rowid_table.last +
1) := row_id;
    end;
    rollback to savepoint one_register;
  end loop;
  close table_cursor;

  for r in rowid_table.first +
1 .. rowid_table.last loop
    dbms_output.put_line(rowid_table(r));
  end loop;
  rollback;
end;

 

使用nowait在表中循环所有记录,判断出所有加锁的行。

 

SQL> exec locksmith('TEST');

 

AAAM1tAAEAAAANWAAB

AAAM1tAAEAAAANWAAC

 

PL/SQL procedure successfully completed

 

 

 

 


推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
author-avatar
处男是你_909
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有