您的位置:首页 > 数据库 > Oracle

Oracle 下 unpin 的cursor 才能被移除

2011-06-18 21:07 211 查看
最近南方的雨下的很烦人。 暴雨,一下就是一天,不过平时我也不怎么出门,所以也就无所谓了。 在家看看电影,做做测试,在补补觉,周末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 才能被移除。

-------------------------------------------------------------------------------------------------------

Blog: http://blog.csdn.net/tianlesoftware
Email: dvd.dba@gmail.com

DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)

DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823

DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: