Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 下 unpin 的cursor 才能被移除

刚才owind 让我做了个测试。 正在使用的cursor 能否被移除。 关于cursor的东西, 几个星期前就准备整理一下的,可是看了一下官方文档,东西太多了。 一时也没不知道从哪下手。 就放那了。 今天这个测试也算对cursor 知识的一个开始。  测试就为证明以下两句话:            cursor is pined ,can"t be age out. only freeable cursor can be flush.            The buffer is now unpinned and is a candidate for immediate aging out。  --创建测试表SQL>create table td as select * from user_tables; --在session A 修改表,注意没有commitSYS@anqing2(rac2)> update td set tablespace_name="users";719 rows updated. --在Session B修改表,同样不commitSYS@anqing2(rac2)> update td set tablespace_name="users";-- 在session A 没有commit的情况下,这里是hang住的,验证一下 --查看session A的SID:SYS@anqing2(rac2)> select sid from v$mystat where rownum=1;        SID----------       130--查看Lock 信息SYS@anqing2(rac2)> select sid,lmode,request from v$lock where type in ("TX","TM");        SID      LMODE    REQUEST---------- ---------- ----------       124          0          6       130          3          0       124          3          0       130          6          0             DML操作一般要加两个锁,一个是对表加模式为3的TM锁,一个是对数据行的模式为6的TX锁。只要操作的不是同一行数据,是互不阻塞的。             根据查询结果,我们看到,Session B 已经拿到了3级别的TM 锁, 现在在等待6级别的TX锁。 但6级的TX 锁在session A(130)持有,所以session B(124)处于等待状态。 -- Flush shared poolSYS@anqing2(rac2)> alter system flush shared_pool;System altered. -- 查看v$sql 里,对应的cursor 是否存在SYS@anqing2(rac2)> select sql_text from v$sql where sql_text like "update%";SQL_TEXT--------------------------------------------------------------------------------update td set tablespace_name=:"SYS_B_0" 我们的cursor 还存在v$sql 里。 -- 在session A 提交SYS@anqing2(rac2)> commit;Commit complete. -- 提交之后,session A 对应的Lock 就释放了。SYS@anqing2(rac2)> select sid,lmode,request from v$lock where type in ("TX","TM");        SID      LMODE    REQUEST---------- ---------- ----------       124          3          0       124          6          0 --session B 结束hang状态后在commitSYS@anqing2(rac2)> update td set tablespace_name="users";719 rows updated.SYS@anqing2(rac2)> commit;Commit complete.  -- 全部commit 之后,我们不flush,查看SYS@anqing2(rac2)> select sql_text from v$sql where sql_text like "update%"; SQL_TEXT--------------------------------------------------------------------------------update td set tablespace_name=:"SYS_B_0" 对应的cursor 还存在 --我们flush 一下SYS@anqing2(rac2)> alter system flush shared_pool;System altered. --查看cursor SYS@anqing2(rac2)>  select sql_text from v$sql where sql_text like "update%"; 刚才的cursor 已经不存在了。  以上测试只为证明一句话:             正在被pin 住的cursor 不能从shared pool里移除,只有unpin的cursor 才能被移除。Oracle Logminer 做数据恢复 说明示例RedHat下Oracle 10 g 静态(slient)安装文档相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数