有表t
SQL> desc t
名称 是否为空? 类型
----------------------------------------- -------- ----------------------
ID NOT NULL NUMBER
PAD VARCHAR2(100)
SQL> select * from t where id = 9;
ID
----------
PAD
--------------------------------------------------------------------------------
9
********************************************************************************
********************
session 1:
SQL> begin
2 for rec in (select 1/0 from t for update) loop --用的隐式游标
3 null;
4
5 end loop;
6 exception
7 when zero_divide then
8 dbms_output.put_line('000');
9 end;
10 /
000 --抛出异常,输出000
PL/SQL 过程已成功完成。
session 2:
SQL> select * from t where id = 9 for update nowait; --可以读取数据 没有问题
ID
----------
PAD
--------------------------------------------------------------------------------
9
********************************************************************************
********************
SQL> commit;
session 1:
SQL> declare
2 cursor rf is select 1/0 from t for update; --用显示游标
3 begin
4 for rec in rf loop
5 null;
6 end loop;
7 exception
8 when zero_divide then
9 dbms_output.put_line('000');
10 end;
11 /
000 --抛出异常
PL/SQL 过程已成功完成。
session 2:
SQL> select * from t where id = 9 for update nowait; --但是这次被锁住了
select * from t where id = 9 for update nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
session 1:
SQL> commit;
提交完成。
session 2:
SQL> select * from t where id = 9 for update nowait; --session 1commit之后,session 1可以读取数据了
ID
----------
PAD
--------------------------------------------------------------------------------
9
********************************************************************************
********************
SQL> commit;
提交完成。
原因是因为隐性游标发生异常时锁会被释放,而显示游标不会释放锁。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25361369/viewspace-712750/
,如需转载,请注明出处,否则将追究法律责任。