【问题标题】:Stop Oracle from caching select query - Running query from Perl阻止 Oracle 缓存选择查询 - 从 Perl 运行查询
【发布时间】:2011-08-30 22:49:50
【问题描述】:

不确定这是 Perl 还是 Oracle 问题。我都是新手。

我在一张表中有 1 行。它的值是一个数字。这个数字会经常更新。

当我从 Perl 运行选择查询以获取此值时……它并不总是最新的值。它通常是一个旧值。我将通过 SQLPLUS 运行相同的查询,我会看到正确的值... Perl 只有在我删除表中的数据并重新插入时才会显示正确的值。

所以,我想知道 - 这个查询是否以某种方式被缓存了?

这就是我在 Perl 中运行查询的方式:

my $sql_latest_jobID = "SELECT /*+ NOCACHE */ job_number FROM example_table WHERE ID = 1";

my $sth = $dbh->prepare($sql_latest_jobID)
            or die "Couldn't prepare statement: " . $dbh->errstr;


            $sth->execute();
            my @data = $sth->fetchrow_array();
            $jobID = $data[0];

我也尝试了没有 NOCACHE 的查询。有同样的结果。

【问题讨论】:

  • 这是不可能的。你确定你已经提交了更新吗? Oracle 不允许脏读,因此如果您没有在 SQL*Plus 中提交更改,您将无法在 Perl 中看到它们 - 请注意,每个会话都是独立的。

标签: perl oracle


【解决方案1】:

我不知道 Perl,但您似乎没有提交数据,因此 Perl 看不到更新的值。

另一种可能是 Perl 将隔离级别更改为可重复读取。如果是这种情况,您将需要通过发出提交或回滚(从 Perl 中)来结束 Perl 中的当前事务(甚至 SELECT 也是一个事务!),以便查看更新的值。

【讨论】:

  • 我没有承诺。现在工作。感谢您的帮助!
【解决方案2】:

Oracle 不会以这种方式缓存结果。你总是会看到表中有什么(提交了什么)。

所以,或者 在 oracle(在 perl 中)之前,您使用一些缓存。 或者 你犯了一个平庸的错误,例如查询另一个表:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2021-09-27
    • 2020-11-28
    • 2019-09-04
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多