[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 メーリングリストの案内