Oracle 下 unpin 的cursor 才能被移除

最近南方的雨下的很烦人。暴雨,一下就是一天,不过平时我也不怎么出门,所以也就无所谓了。在家看看电影,做做测试,在补补觉,周末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');

SIDLMODEREQUEST

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

12406

13030

12430

13060

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');

SIDLMODEREQUEST

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

12430

12460

--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才能被移除。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值