Oracle OCI不查询缓存结果

时间:2012-08-21 14:49:18

标签: c++ database oracle caching oci

我正在使用OCI开发一个C ++程序来从Oracle数据库中查询一些结果集。我发现即使我使用“update table set col=xxx where xxx”手动更新行,结果集也会被缓存。 OCI调用仍在获取旧数据。这个缓存是如何发生的?有没有办法禁用它?如何检查缓存是否真的发生?通过检查执行计划?

2 个答案:

答案 0 :(得分:3)

当您在单独的会话(SQL * Plus会话)中进行更改时,只有在commit更改时,这些更改才会对当前会话(您的OCI应用程序)可见。在{* 1}} SQL * Plus中的事务之前,您将继续查看该行的当前版本,而不是您在SQL * Plus会话中更改的版本。您的OCI应用程序使用commit的默认事务隔离,因此您只能读取已提交的数据。

要注意的一件事是,如果从OCI应用程序打开游标,从游标句柄获取的数据就是光标打开时存在的数据。因此,如果您在OCI中打开游标,在SQL * Plus中提交更改,然后从OCI获取数据,您的OCI应用程序将看不到SQL * Plus中提交的更改。您必须重新打开游标才能看到新提交的行。

从技术上讲,这不是缓存。相反,这就是Oracle的多版本读取一致性的工作原理。假设默认事务隔离级别,每次打开游标时,都会捕获当前SCN(系统更改编号),并且检索的数据是该SCN的数据。如果块已经更改(无论是否已提交),则自该SCN后,Oracle会将该更改的UNDO向量应用于块,然后再将其返回到会话中。

答案 1 :(得分:1)

是的,您需要在SQL * Plus或SET AUTOCOMMIT ON中提交。

查看查询计划将清楚地显示客户端结果缓存是否正在使用,您将在RESULT CACHE列中看到Operation