`
izuoyan
  • 浏览: 9204755 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle中锁定行的查找方法

阅读更多

锁定行的查找

要查找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

分享到:
评论

相关推荐

    查找oracle锁定脚本

    查找oracle锁定脚本 select nvl(S.USERNAME,'Internal') username, nvl(S.TERMINAL,'None') terminal, L.SID||','||S.SERIAL# Kill, U1.NAME||'.'||substr(T1.NAME,1,20) tab, decode(L.LMODE,1,'No Lock', 2,...

    oracle查找死锁

    ### Oracle查找及解决死锁的方法 在Oracle数据库的日常管理和维护过程中,死锁是一个常见的问题。当两个或多个会话互相等待对方释放资源时就会发生死锁,这会导致相关事务无法继续执行,甚至可能会影响到整个数据库...

    Oracle数据库账号被锁定解决方法

    在Oracle数据库操纵中,登录Oracle账号时提示失败,并且Oracle账号频繁被锁定。造成此故障的原因是什么呢?本文就介绍了这一过程,经由过程慢慢排查我们就能找到该故障的原因了。 下面记录下查找这个题目的步调。 1....

    解决Oracle system或用户被锁定问题

    2. **查找锁定的用户**:登录后,在Recent中可以找到名为scott@(或其他用户)的账户,其状态显示为锁定(图标为灰色钥匙上有一个X)。 3. **编辑用户**:在对象列表中找到“users”选项,选择被锁定的用户,如...

    Oracle数据库查询优化的方法

    索引是数据库中用于快速查找记录的一种数据结构,选择性高的列(即具有较少重复值的列)创建索引可以显著提高查询效率。Oracle支持B树索引、位图索引和函数索引等多种类型,根据实际需求选择合适的索引类型。 其次...

    快速查找oracle锁对象

    在Oracle数据库管理中,"快速查找Oracle锁对象"是一个关键任务,特别是在处理并发事务和解决性能问题时。当多个用户或进程同时访问同一资源时,可能会出现锁冲突,导致某些事务等待,影响数据库的正常运行。了解如何...

    oracle存储过程解锁

    当遇到存储过程被锁定的情况时,通常可以通过查询`dba_ddl_locks`视图来查找锁定的详细信息。例如,要检查名为`prc_exec_day`的存储过程是否被锁定,可以运行以下SQL查询: ```sql SELECT * FROM dba_ddl_locks ...

    ORACLE 如何查询被锁定表及如何解锁释放session

    在Oracle数据库中,当一个事务开始执行时,它可能会锁定表或行以防止其他事务同时对其进行修改。这种锁定机制有助于保持数据的一致性和完整性,但也可能导致死锁或其他性能问题。因此,了解如何查询当前被锁定的表...

    Oracle数据库表中字段顺序的修改方法

    在Oracle数据库中,表结构的设计是数据库管理的重要环节。一旦设计完成后,有时因需求变化,我们需要在已有的表中添加新的字段或者调整字段顺序。本文将详细介绍如何在Oracle数据库中修改表字段的顺序。 首先,让...

    oracle清除死锁

    在Oracle数据库中,当两个或多个事务在等待对方释放锁定资源时会发生死锁。这种情况下,所有事务都将被阻塞,无法继续执行,直到其中一个事务回滚或者系统采取措施解决。 #### 二、死锁检测与处理 ##### 2.1 死锁...

    如何解决Oracle杀死死锁进程

    解决 Oracle 杀死死锁进程的方法可以分为两步:首先,查找被锁定的表和锁定的会话,然后杀死锁定的会话和操作系统进程。 在解决死锁问题时,需要注意以下几点: * 需要拥有足够的权限来杀死锁定的会话和操作系统...

    oracle 死锁时候 ,杀进程方法

    本文将详细介绍在Oracle数据库中出现死锁时,如何查找并终止导致问题的进程。 #### 1. 识别死锁 首先,我们需要确定确实发生了死锁。可以通过查询`v$locked_object`视图来查看锁定的对象和相关的会话信息: ```...

    查看oracle数据库的连接数以及用户、数据库锁定进程

    ### 查看Oracle数据库的连接数以及用户、...以上是关于如何在Oracle数据库中查看连接数、用户权限及处理锁定进程的相关知识点。这些命令对于日常数据库管理和维护非常重要,能够帮助DBA快速定位问题并进行有效的管理。

    清除Oracle中长时间持锁的session

    #### 查找被锁定的过程 首先,我们需要找到被锁定的具体过程。可以通过查询`V$DB_OBJECT_CACHE`视图来获取相关信息。该视图显示了当前被缓存在库缓存中的数据库对象,包括表、索引、簇、同义词定义、PL/SQL过程和包...

    Oracle SQL(SQL for Oracle)

    Oracle SQL,全称为结构化查询语言在Oracle数据库环境中的应用,是数据库管理员和开发人员用于检索、更新和管理Oracle数据库的核心工具。Oracle SQL是SQL标准的扩展,它提供了许多特有的功能,以满足企业级数据库...

    queryreatch_oracle_

    在Oracle数据库管理中,"queryreatch_oracle_"这一主题主要涉及到如何查找并解决数据库中的锁定问题。查询被锁对象及其信息是数据库管理员在日常维护工作中经常会遇到的问题,尤其是在并发事务处理频繁的环境中。...

    在Windows 7下安装Oracle 11g的解决方法

    以下是在Windows 7环境下安装Oracle 11g的具体解决方法: 首先,当尝试安装Oracle 11g时,系统会进行一系列的产品特定先决条件检查,而在Windows 7上,Oracle 11g可能识别不出操作系统的兼容性,导致安装失败。为了...

    怎样快速查出Oracle_数据库中的锁等待

    然而,在Oracle 8.0.x中执行"获取正在等待锁资源的用户名"的查询语句是十分缓慢的,而执行"查找阻塞其它用户的用户进程"的查询语句也是如此。 为了解决这个问题,可以通过将问题发生时的 v$lock、v$session 视图中...

Global site tag (gtag.js) - Google Analytics