[seasar-dotnet:2142] S2Dao.NetでORA-01002が稀に発生する現象について(再送)

K.Ohmori [E-MAIL ADDRESS DELETED]
2012年 4月 3日 (火) 20:47:07 JST


大森と申します。

当方が昨日投稿しました記事を保存書庫スレッドにて拝見したところ
タイトルのみ正常で本文がすべて文字化けをおこしておりました。
MLメンバーの皆さまには大変ご迷惑をおかけしました。

当方にて利用しているメーラーでの投稿ですと、文字コードの問題が
あるようですので、再三で申し訳ありませんが投稿記事を
別のメーラーから再送させていただきます。



現在従事しているプロジェクトで稼働中のシステムの
更新処理(Quillでのトランザクション処理)にて下記の現象が発生していまして、
なかなか収束できず苦しんでおります。

どこがまずいのか指摘点があれば教えていただけないでしょうか。
もしくは同様あるいは類似した現象の解決事例をお持ちの方が
いらっしゃいましたら、どうかご教授ください。


[事象]
○VB.netの画面からの更新処理を実行する際の
  トランザクション処理部にて、対象データのロックを
  行っているが、ロックに失敗して
  「ORA-01002:フェッチ順序が無効です。」が発生する
○一貫した再現性がなく、稀にしか発生しない
○画面を閉じずに登録を繰り返している時に発生している模様
○1回目の更新実行時にはまず発生しない
  ⇒現象発生時に画面を閉じて(DB切断している)、起動し直して
    登録を実行すると正常更新できる
○1度発生すると、入力内容を保持して更新処理を再実行しても
  再度失敗することがある。失敗を繰り返す時は10分以上続くこともある。


[システム環境]
○サーバーOS:Windows2008 R2 (64Bit)
  ⇒VM Ware ESX Server上で稼動する仮想OSです
  ⇒VMは3つあり、サーバAに共用DBを上位に位置させ、
    その下位にサーバBとC(事業所別のDB)が同位で位置します。
○DB:Oracle 11g R2 11.2.0.1.0(64Bit)
  ⇒VM3機A、B、CそれぞれがDBサーバであり、サーバ間の連携は
    マスタ:マテリアライズドビューでDB同期
    トラン:テキスト連携(SQL loaderで取込)
○クライアントOS:Windows 7
  ⇒F社のデスクトップ機です
  ⇒サーバA、B、Cの物理筐体がある拠点と、クライアントの拠点は
    NTTのVPNワイドにてWAN接続されています
○開発言語:VB.NET (Framework 3.5)
○開発環境:Visual Studio 2008
○S2Container.net:1.4.0 RC2
○ODP.NET サーバー側64bit 11.2.0.0、クライアント側32bit 11.2.0.2


[補足]
○トランザクション処理での更新対象テーブルが複数ある
○トランザクション処理の冒頭、UPDATEやINSERT発行前にロックしている
○ロックはSELECT ~ FOR UPDATE NO WAITで発行
○トランザクション処理を実装しているサービス実装クラスのメソッドには「<Transaction()> 

_」を指定
⇒VMのDBが分かれていますので各DB用にTransactionSetting拡張しています。
○サービス実装クラスのメソッドには「Public Overridable Function」を指定
○トランザクション処理を実装しているメソッド内で、DAOに定義した
   メソッド(※)を呼び出している
   ※「<Procedure("hogehoge")> _」を指定しPL/SQLパッケージ(ストアード・
      プロシージャ)をコールしている
○PL/SQL内はトランザクション処理は宣言していない
○CURSOR検索中にコミットは行っていません
○接続プール関連の指定はすべて未指定=既定値。
  (Connection PoolやMAX Pool Size、LifeTimeなど)
○登録実行時のメソッドの流れは下記の通り
   1)formのF10キーに割当した登録ボタンを押下
   2)formのボタンClickイベントプロシージャ呼出
   3)2)内で更新処理(formメソッド)を呼出
   4)サービスインタフェースの更新処理(「<Implementation()> _」指定)のメソッド呼出
      ⇒実体はサービス実装クラスの更新処理(「<Transaction()> _」指定)のメソッド 


   5)4)のメソッド内の冒頭で、更新処理前にロックしている
   6)トラン1~3の更新
   7)トラン4の更新
   8)5)でロックしているトラン5の更新
○アプリケーションログを添付します
[正常系]hoge_seijou.log
   1)3行目:トランザクション処理開始
   2)6~17行目:更新対象データをロック
   3)18~24行目:トラン1をINSERT
   4)25~31行目:トラン2をINSERT
   5)32~39行目:トラン3をINSERT
   6)40~56行目:データ抽出
   7)58行目:PL/SQL呼出(トラン4を更新⇒トリガ連動⇒別テーブルデータを更新)
   8)78行目:PL/SQL呼出(トラン5を更新)
   9)79・80行目:更新(コミット)正常完了
[異常系]hoge_ijou.log
   1)3行目:トランザクション処理開始
   2)6~17行目:更新対象データをロック
   3)20行目:「ORA-01002: フェッチ順序が無効です」が発生

以上よろしくお願いいたします。 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: hoge_seijou.log
Type: application/octet-stream
Size: 5990 bytes
Desc: $BL5$7(B
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20120403/16ae73e1/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: hoge_ijou.log
Type: application/octet-stream
Size: 3551 bytes
Desc: $BL5$7(B
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20120403/16ae73e1/attachment-0001.obj>


seasar-dotnet メーリングリストの案内