Oracle 下 unpin 的cursor 才能被移除
来源:互联网 发布:java http 下载文件 编辑:程序博客网 时间:2024/06/01 14:44
最近南方的雨下的很烦人。 暴雨,一下就是一天,不过平时我也不怎么出门,所以也就无所谓了。 在家看看电影,做做测试,在补补觉,周末2天也就过去了。
刚才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 修改表,注意没有commit
SYS@anqing2(rac2)> update td set tablespace_name='users';
719 rows updated.
--在Session B修改表,同样不commit
SYS@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 pool
SYS@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状态后在commit
SYS@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 下 unpin 的cursor 才能被移除
- Oracle 下 unpin 的cursor 才能被移除
- oracle Cursor的例子
- Oracle CURSOR的使用方法
- Oracle Cursor的使用
- oracle cursor的使用
- Oracle cursor的用法.
- ORACLE cursor的使用
- Oracle Cursor的使用
- Oracle Cursor的使用
- 如何移除干净的oracle数据库
- Oracle database 11g RAC:正常情况下的节点移除
- Oracle CURSOR的简单用法
- oracle ref cursor的介绍
- oracle 的 REF CURSOR小结
- ORACLE游标(cursor)的使用
- Oracle的 Cursor(一)
- Oracle Cursor游标的使用
- 上帝对待每一个人都是公平的
- 移植经验
- 读文件java
- uva 10176 ocean deep make it shallow
- 0.1.4.3版脚本工具界面中增加了一个变量查看功能
- Oracle 下 unpin 的cursor 才能被移除
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- Zookeeper 3.3.3 LeaderElection算法总结
- Android中使用TextView图文混排实现动态表情
- JDOM获取子节点时候,有时候需要命名空间
- 【项目经验】cocos2D场景切换方式总汇
- poj1185 状态dp
- POJ 2771 Guardian of Decency (最大独立集Hungary)
- 我脑袋里面的未来数码设备