【问题标题】:Can I get ORA-08177 if there's only one connection to the database?如果只有一个与数据库的连接,我可以得到 ORA-08177 吗?
【发布时间】:2010-11-03 09:00:02
【问题描述】:

我的任务是在 oracle 的 Storm 后端上运行单元测试,以便我们可以查看后端的质量是否足以在生产中使用。我遇到的一个问题是,如果我以可序列化模式连接,我会得到 ORA-08177(无法序列化此事务的访问)。当我使用读取提交模式时,问题就消失了。

现在我阅读了this ask tom 的文章,它表明这基本上是一个并发问题。

假设我只有一个线程连接到数据库,而世界上没有其他线程 正在连接到这个数据库,是否有可能得到这个错误?如果是这样,有人可以为我提供一个会产生此错误的示例查询吗?

或者这可能表示游标或连接未在某处关闭?还是没有提交或回滚事务?

【问题讨论】:

  • 什么版本的Oracle?根据您的版本,此区域存在一些错误...
  • 另外,每次的行为都是一样的吗?还是有时会起作用?
  • 10g。此外,它每次都会发生,但每次都会发生在不同的查询中。
  • Jason,您尝试更新/插入的表上是否有触发器?
  • 涉及个触发器,但我在 DDL 语句中遇到错误,而不是在更新或插入时。

标签: oracle oracle10g serialization ora-08177 read-committed


【解决方案1】:

个触发器涉及,但我在 DDL 语句中遇到错误,而不是在更新或插入时。”

DDL 语句应该处理它们自己的提交。基本上他们会进行提交,然后元数据更改(可能涉及许多底层对象)然后再次提交(假设 DDL 成功 - 如果失败,则应回滚更改)。

因此,如果您正在执行 DDL,那么提交应该是安全的,将事务更改为读取已提交,执行 DDL,然后将事务更改回可序列化。 如果您可以提供完整的测试用例(或至少您正在谈论的那种 DDL),它可能会有所帮助。例如,物化视图创建或 CREATE TABLE AS SELECT 可能是“奇怪的”,因为它是 DDL(具有其特殊提交)加上 DML。

【讨论】:

  • 谢谢。这真的是我可以让这些工作的唯一方法,所以我想这是我应该接受的答案。
【解决方案2】:

只有一个会话,您应该不会收到此错误。然而,以下脚本将生成一个辅助会话,它将独立于第一个会话更新一行,从而允许我们触发 ORA-8177。我不确定这是否是你想要的。

考虑:

SQL> alter session set isolation_level=serializable;

Session altered
SQL> create table test (a number);

Table created
SQL> insert into test values (1);

1 row inserted
SQL> commit;

Commit complete
SQL> declare
  2     pragma autonomous_transaction;
  3  begin
  4     update test set a = 2;
  5     commit;
  6  end;
  7  /

PL/SQL procedure successfully completed
SQL> update test set a = 3;

update test set a = 3

ORA-08177: can't serialize access for this transaction

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多