Discussions
Categories
- 196.8K All Categories
- 2.2K Data
- 238 Big Data Appliance
- 1.9K Data Science
- 450.3K Databases
- 221.7K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 550 MySQL Community Space
- 478 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3K ORDS, SODA & JSON in the Database
- 544 SQLcl
- 4K SQL Developer Data Modeler
- 187K SQL & PL/SQL
- 21.3K SQL Developer
- 295.8K Development
- 17 Developer Projects
- 138 Programming Languages
- 292.5K Development Tools
- 107 DevOps
- 3.1K QA/Testing
- 646K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 155 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.1K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 18 Java Essentials
- 160 Java 8 Questions
- 86K Java Programming
- 80 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 204 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 437 LiveLabs
- 38 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 171 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 232 Portuguese
ORA-08177: このトランザクションのアクセスをシリアル化できません
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側の初期の設定等が不足しているのでしょうか?
エラー解消の良い案等ありましたら、ご教示ください。
Best Answer
-
impの前に個別にCREATE TABLEすることで解決しました。
■変えたこと
ROWDEPENDENCIES を付与
INITRANS を増やす
ありがとうございました。
Answers
-
Oracle12Cは使ったことがありませんが、各セッションで
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED ;
を実行してから、DELETE以下を実行したら解決するでしょうか?
ALTER SESSION についてはSQL言語リファレンス マニュアルを参照してください。
-
返信ありがとうございます。
17日まで試せる環境下にいないため、17日に試してみます。
後出しの情報になって非常に申し訳ないですが、
>1つのSQL毎にトランザクションを使用するという無駄な処理は行っていますが、
こちらの処理は共通処理となっており、トランザクションは意図的にSERIALIZABLEを使用しています。
バージョンの違いで挙動が違うのか、設定不足で挙動が違うのか…
という視点でばかり考えていました。
-
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を同順番に実行した時はエラーとなりませんでした。
この動作について分かる方いらっしゃいましたら、情報等いただければと思います。
-
impの前に個別にCREATE TABLEすることで解決しました。
■変えたこと
ROWDEPENDENCIES を付与
INITRANS を増やす
ありがとうございました。