[Seasar-user:13014] Re: [DBFlute]SqlLogRegist ry について

kubo [E-MAIL ADDRESS DELETED]
2008年 2月 22日 (金) 23:31:26 JST


久保です。

参考になる過去のMLです。

http://ml.seasar.org/archives/seasar-user/2007-February/006320.html
http://ml.seasar.org/archives/seasar-user/2007-July/009258.html

どうやら、JDBCのバージョンによっては修正されているようです。


2008/2/22 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保です。
>
>  ご報告ありがとうございます。
>
>  利用DBはOracleでいいでしょうか?
>  (以前のMLから想像してます)
>
>  OracleのJDBCドライバがバッチ更新の結果を
>  正確に返してくれないようなので(事象からすると)、
>  batchUpdate()の排他制御機能はOracleでは効かないです。
>  で、判定がどうしてもできないため、その回避策もありません。
>  (幾つかの他のDBでは大丈夫でした(MySQLなど))
>
>  dbflute-oracle-exampleに以下のようなテストを追加して
>  やってみました。(ojdbc14.jar / ojdbc5.jar両方で同じでした)
>
>     public void
>  test_batchUpdate_JDBCDriverCannotReturnAccurateResult_Tx() throws
>  Exception {
>         // ## Arrange ##
>         final List<Member> memberList = new ArrayList<Member>();
>         final Member member = new Member();
>         member.setMemberId(1L);
>         member.setMemberName("Billy Joel");
>         member.setMemberAccount("billyjoel");
>         member.classifyMemberStatusCodeFormalized();
>         member.setVersionNo(-99L);
>         memberList.add(member);
>
>         // ## Act ##
>         int[] updatedResult = null;
>         try {
>             updatedResult = memberBhv.batchUpdate(memberList);
>             // fail();
>         } catch (EntityAlreadyUpdatedException e) {
>             fail("本来はOKなのはずだが、OracleのJDBCドライバが正確な更新結果を返してくれない");
>         }
>
>         // ## Assert ##
>         log("updatedResult[0] = " + updatedResult[0]);
>         assertEquals(Statement.SUCCESS_NO_INFO, updatedResult[0]);
>         ...
>     }
>
>  もし、Oracleのサポートなど問い合わせ可能な窓口があれば、
>  そちらに問い合わせして頂くしかないかなというところです。
>  (正確な値を返すJDBCドライバのバージョンがあるのか?など)
>
>  しっかり仕様として提示できなかったこと大変申し訳ありません。
>  こちら、取り急ぎドキュメントに反映させておきました。
>  http://dbflute.sandbox.seasar.org/contents/dbvendor/oracle.html
>
>
>  2008/2/22  <[E-MAIL ADDRESS DELETED]>:
>
>
> > いつもお世話になっております。
>  >  米原です。
>  >
>  >
>  >
>  >  >> 「-2」が入っていました。
>  >  >ちょっとやな予感しますね。。。
>  >
>  >  >逆に更新がうまくいったときは何が戻るか
>  >  >確認頂けますでしょうか?
>  >
>  >
>  >  うまくいったとき(単発で動かしたとき)も「-2」を返してます。
>  >  また、ログも同様に(All updated count: -2 result={-2})
>  >  と出てます。
>  >
>  >  だいぶ見にくいですが、batchUpdate単発で動かしたときの
>  >  batchUpdateのログを一応つけますね。
>  >
>  >
>  >
>  >  2008.02.22 22:39:53.390,/================================================================================
>  >  2008.02.22 22:39:53.390,                                                      XxxDao.updateList()
>  >  2008.02.22 22:39:53.390,                                                      ==========================/
>  >  2008.02.22 22:39:53.406,XxxUnitPage.doRunEdit():776 --> XxxBhv.batchUpdate() --> ...
>  >  2008.02.22 22:39:53.406,UPDATE XXX SET A = '000000201', UPD_NITIJI = '2008-02-22 22.39.53', B = '201', C = '202', D = '203', E = '住所204', F = '内容205', G = '09000000201 ', H = '20061210  ', I = null, J = '1 ', K = '2 ', L = '2 ', M = '2 ', N = '2 ', O = '1 ', P = 1, Q = 1, R = 1, S = 1, T = 1, U = '2', V = '1', TRK_NITIJI = null, W = null, X = '131011', Y = null, Z  = 'xap' WHERE ID = 196 AND UPD_NITIJI = '2008-02-22 22.39.23'
>  >  2008.02.22 22:39:53.406,===========/ [00m00s000ms - All updated count: -2 result={-2}]
>  >  2008.02.22 22:39:53.406,
>  >  2008.02.22 22:40:00.437,/================================================================================
>  >
>  >
>  >
>  >
>  >
>  >
>  >
>  >
>  >
>  >  >batchUpdate()の実行時のSQLのログで、
>  >  >Where句に排他制御用の条件が付与されていますか?
>  >  >(ex. WHERE BOOK_ID = 2 AND U_TIMESTAMP = '2007...')
>  >
>  >  はい、付与されています。
>  >
>  >
>  >  >また、batchUpdate()の戻り値は何が入っていますでしょうか?
>  >  >int[]の中身をご確認お願いします。
>  >
>  >  1回目のbatchUpdate,2回目のbatchUpdate(楽観排他時)とも
>  >  「-2」が入っていました。
>  >
>  >  ログを見るとそれぞれ、同じ以下の結果です。
>  >  (All updated count: -2 result={-2})
>  >
>  >  _______________________________________________
>  >  Seasar-user mailing list
>  >  [E-MAIL ADDRESS DELETED]
>  >  https://ml.seasar.org/mailman/listinfo/seasar-user
>  >
>


Seasar-user メーリングリストの案内