[Seasar-user:13013] Re: [DBFlute]SqlLogRegist ry について
kubo
[E-MAIL ADDRESS DELETED]
2008年 2月 22日 (金) 23:16:19 JST
久保です。
ご報告ありがとうございます。
利用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 メーリングリストの案内