如果只有一个数据库连接,我可以获得ORA-08177吗?

时间:2009-06-16 14:57:38

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

只有一个会话,您不应该收到此错误。但是,以下脚本将生成一个辅助会话,该会话将独立于第一个会话更新一行,从而允许我们触发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

答案 1 :(得分:1)

“有触发器,但我在DDL语句上得到错误,而不是更新或插入错误。”

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

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