c++ - Oracle OCI 不查询缓存结果

标签 c++ database oracle caching oracle-call-interface

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

最佳答案

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

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

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

关于c++ - Oracle OCI 不查询缓存结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12057520/

相关文章:

c++ - 你会推荐我什么 C++ IDE/方法?

php - 如何扩展 Adminer 以支持带登录的 SQLite 数据库?

android - 数据库打开/关闭 - 数据库未打开

oracle - 运行pl/sql的目标列表中不存在程序?

sql - 获取多行相等的人(Oracle SQL)

c++ - 我不确定在使用 Curl 时如何查看 TLS session 详细信息

c++ - 如何修复 C++ "Undefined reference to ..."C 函数指针?

c++ - 使用函数从 C++ 中的数组中删除重复项

php - 检查用户角色和用户限制

sql - 在 Oracle 中 'Buffer Gets' 实际上指的是什么?