设为首页 收藏本站
查看: 399|回复: 0

[经验分享] Oracle中锁定行的查找方法

[复制链接]

尚未签到

发表于 2016-8-9 06:02:54 | 显示全部楼层 |阅读模式
锁定行的查找

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




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254851-1-1.html 上篇帖子: 从Oracle到DB2,问题集(一) 下篇帖子: oracle笔记 (procedure 递归构造树)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表