我正在开发使用OCI来从Oracle数据库查询某些结果集的C ++程序。我发现即使我已经用'update table set col=xxx where xxx
'手动更新了行,结果集仍被缓存。 OCI呼叫仍在获取旧数据。这种缓存如何发生?有没有办法禁用它?如何检查缓存是否真的发生?通过检查执行计划?
最佳答案
当您在单独的会话(SQL * Plus会话)中进行更改时,只有在您commit
进行更改时,这些更改才对当前会话(您的OCI应用程序)可见。在SQL * Plus中对事务进行commit
之前,您将继续看到该行的当前版本,而不是您在SQL * Plus会话中更改的版本。您的OCI应用程序正在使用默认的事务隔离READ COMMITTED
,因此您只能读取已提交的数据。
要注意的一件事是,如果从OCI应用程序打开游标,则从游标句柄中获取的数据就是在打开游标时存在的数据。因此,如果您在OCI中打开游标,在SQL * Plus中提交更改,然后从OCI中获取数据,则您的OCI应用程序将看不到在SQL * Plus中提交的更改。您必须重新打开游标才能查看新提交的行。
从技术上讲,这不是缓存。相反,这就是Oracle多版本读取一致性的工作方式。假定使用默认事务隔离级别,则每次打开游标时,都会捕获当前的SCN(系统更改号),并且检索到的数据与该SCN相同。如果自该SCN以来某个块发生了更改(无论是否已提交),则Oracle在将该更改返回到您的会话之前,将对该更改的UNDO向量应用于该块。
关于c++ - Oracle OCI不查询缓存结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12057520/