2009-06-16 26 views
2

私は、バックエンドが実稼働環境で使用するのに十分な品質かどうかを確認できるように、オラクルのストームバックエンドで単体テストを実行することが任されています。私が実行している1つの問題は、シリアル化可能なモードで接続すると、ORA-08177(このトランザクションのアクセスをシリアル化できません)が表示されていることです。リードコミットモードを使用すると問題が解消されます。データベースへの接続が1つしかない場合、ORA-08177を入手できますか?

今、私はthis ask tomの記事を読んでおり、これは基本的に並行性の問題であることを示しています。

データベースに接続しているスレッドが1つしかなく、他の誰もこのデータベースに接続していないと仮定すると、 はこのエラーに遭遇しますか?もしそうなら、誰かがこのエラーを発生させるサンプルクエリを私に提供することができますか?

これはカーソルまたは接続がどこかで閉じられていない可能性がありますか?トランザクションがコミットまたはロールバックされていない

+0

どのOracleのバージョンですか?あなたのバージョンに応じてこのエリアにいくつかのバグがあります... – DCookie

+0

また、毎回同じ動作ですか?それとも、時にはうまくいくのですか? – DCookie

+0

10g。また、毎回発生しますが、毎回異なるクエリで発生します。 –

答えて

1

DDL文がコミット自分自身を扱う必要がある「が関与トリガが、私はDDL文ではなく、更新時にエラーが出るか、挿入していますがあります。」 。基本的にコミットし、メタデータが変更され(いくつかの基本オブジェクトを含む)、コミットが再度行われます(DDLが成功した場合、失敗した場合はロールバックする必要があります)。

DDLを行っていた場合は、トランザクションをコミットして読み込み、DDLを行った後、トランザクションをシリアル化可能に戻すことが安全です。 完全なテストケース(または少なくともあなたが話しているDDLの種類)を与えることができれば、それは役に立つかもしれません。たとえば、マテリアライズド・ビューの作成またはCREATE TABLE AS SELECTは、DDL(固有のコミットを含む)にDMLを加えたものになるため、「奇妙」になる可能性があります。

+0

ありがとうございます。これが実際に働く唯一の方法なので、これが私が受け入れるべき答えだと思います。 –

1

セッションが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 
関連する問題