2

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

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

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

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

4

2 回答 2

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
于 2009-06-16T15:08:55.737 回答
1

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

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

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

于 2009-06-19T00:22:50.320 回答