ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 显示游标与隐式游标对加锁的区别

显示游标与隐式游标对加锁的区别

原创 Linux操作系统 作者:tyoodz 时间:2011-12-05 17:06:30 0 删除 编辑
有表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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 绑定变量的缺点
请登录后发表评论 登录
全部评论

注册时间:2011-05-16

  • 博文量
    55
  • 访问量
    87645