Forum Stats

  • 3,768,658 Users
  • 2,252,827 Discussions
  • 7,874,676 Comments

Discussions

ORA-08177: このトランザクションのアクセスをシリアル化できません

3009122
3009122 Member Posts: 4
edited Aug 18, 2015 12:06AM in データベース一般

9i (9.2.0.8.0) から 12c (12.1.0.1.0) への移行でORA-08177が発生し困っています。

■旧環境

 OS:Windows Server 2003 R2 SE (32bit)

 OracleServer:9.2.0.8.0

 OracleClient:10.2.0.4.0

 Webアプリ:.NetFramework 2.0

■新環境

 OS:Windows Server 2012 R2 SE (64bit)

 OracleServer:12.1.0.1.0

 OracleClient:12.1.0.1.0

 Webアプリ:.NetFramework 2.0

■移行方法

exp USER/PASS file=(xxx.dmp)

imp USER/PASS file=(xxx.dmp) full=y

Webアプリ側ではOracleClientを利用し、データベースに接続しています。

環境移行の際、ソースの変更は一切行っておりませんが

旧環境と新環境で複数ユーザによる同じ操作を行ったところ、新環境側だけで「ORA-08177:

このトランザクションのアクセスをシリアル化できません」というエラーが発生しています。

■操作内容

[ユーザA]

  DELETE FROM tbl1 WHERE user='A';

 INSERT INTO tbl1(user,col1,col2) VALUES('A',1,1);

 以下類似INSERTが2-300件程度

[ユーザB]

  DELETE FROM tbl1 WHERE user='B';

 INSERT INTO tbl1(user,col1,col2) VALUES('B',1,1);

 以下類似INSERTが2-300件程度

1つのSQL毎にトランザクションを使用するという無駄な処理は行っていますが、

旧環境ではエラーが発生していないため、頭を悩ませている状況です。

複数回試行しTraceログを確認したところでは、DELETE文でも

INSERT文でもエラーが発生しています。

Server側の初期の設定等が不足しているのでしょうか?

エラー解消の良い案等ありましたら、ご教示ください。

Tagged:

Best Answer

  • 3009122
    3009122 Member Posts: 4
    edited Aug 18, 2015 12:06AM Accepted Answer

    impの前に個別にCREATE TABLEすることで解決しました。

    ■変えたこと

    ROWDEPENDENCIES を付与

    INITRANS を増やす

    ありがとうございました。

Answers

  • Papageno
    Papageno Member Posts: 53 Blue Ribbon
    edited Aug 13, 2015 4:50AM

    Oracle12Cは使ったことがありませんが、各セッションで

    ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED ;

    を実行してから、DELETE以下を実行したら解決するでしょうか?

    ALTER SESSION についてはSQL言語リファレンス マニュアルを参照してください。

  • 3009122
    3009122 Member Posts: 4
    edited Aug 13, 2015 8:24AM

    返信ありがとうございます。

    17日まで試せる環境下にいないため、17日に試してみます。

    後出しの情報になって非常に申し訳ないですが、

    >1つのSQL毎にトランザクションを使用するという無駄な処理は行っていますが、

    こちらの処理は共通処理となっており、トランザクションは意図的にSERIALIZABLEを使用しています。

    バージョンの違いで挙動が違うのか、設定不足で挙動が違うのか…

    という視点でばかり考えていました。

  • 3009122
    3009122 Member Posts: 4
    edited Aug 17, 2015 12:28AM

    ISOLATION_LEVELを変更しては、動作が変わってしまうと気付き試行しませんでした。

    SQLレベルでの確認を進めました。

    下記、括弧内が接続のセッションを表すものとしてお読み下さい。

    【A】 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    【B】 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    【A】 INSERT INTO tbl1(user,col1,col2) VALUES('A',1,1);

    【B】 DELETE FROM tbl1 WHERE user='B';

     ★この時点で ORA-08177: このトランザクションのアクセスをシリアル化できません

      とエラーが発生しました。

    AもBも commit; していない状態です。

    また、9iで同SQLを同順番に実行した時はエラーとなりませんでした。

    この動作について分かる方いらっしゃいましたら、情報等いただければと思います。

  • 3009122
    3009122 Member Posts: 4
    edited Aug 18, 2015 12:06AM Accepted Answer

    impの前に個別にCREATE TABLEすることで解決しました。

    ■変えたこと

    ROWDEPENDENCIES を付与

    INITRANS を増やす

    ありがとうございました。

This discussion has been closed.