[Seasar-user:13130] VersionNoによる排他制御の値のインクリメントについて
Minoru Taki
[E-MAIL ADDRESS DELETED]
2008年 3月 3日 (月) 17:50:56 JST
瀧です。
お世話になります。
自動更新SQLのVersionNoのインクリメントの制御についてお伺いします。
以前、[Seasar-user:10429]にて会話されている内容に関わる問題ですが、
使い方によっては排他にならないケースが出てくると思いメールしました。
ユーザAの自動更新SQL実行前に、ユーザBが先に更新&コミットしていた場合に、
VersionNoは1インクリメントされてDBに登録されていると思いますが、
その際にユーザはVersionNoが異なるため、NotSingleRowUpdateRuntimeExceptionが
発生し、ユーザAが排他エラーになることまではOKなのですが、
インクリメントする際に、ユーザAの同じポインタのVersionNoのプロパティ自体を
内部で1インクリメントしているため、そのまま再度同じポインタをもって
更新処理を実行すると更新できてしまいます。
(エラー発生後はユーザBと同じVersionNoになる)
この場合再実行してもエラーにしたいので、
(つまり、再検索して新しいVersionNoにしないと更新できないようにしたい)
同じポインタのVersionNoを1インクリメントするのではなく、SQLの式を組み立てるときに
1インクリメントした値を代入する仕様が望ましいのですが、[Seasar-user:10429]の仕様と
相反する仕様になると思います。
例外が発生した場合は、業務ロジックで1戻す処理等をしなければならないでしょうか?
更新時に一律インクリメントする・しないを設定するオプション等があればうれしいのですが。
また他に代案があればご教授願います。
以上、よろしくお願い致します。
----- Original Message -----
From: "Hirotaka HONMA" <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Sent: Monday, September 10, 2007 12:39 PM
Subject: [Seasar-user:10429] Re: [S2Dao]VersionNoによる排他制御が2回目の更新以降、正しく行われない。
> 本間@茅場町です。
>
> on Mon, 10 Sep 2007 12:08:28 +0900
> in [Seasar-user:10426] [S2Dao]VersionNoによる排他制御が2回目の更新以降、正しく行われない。
> nobu <[E-MAIL ADDRESS DELETED]> wrote:
>
>> テーブルのversionnoの値は、insert,update(1回目),update(2回目)で、次のよ
>> うに変化していくと思っています。
>
> はい、この認識であっています。
>
> zip配布のS2Daoに付属しているサンプルで確認できると思います。
> examples.dao.DepartmentDaoClient
> の最後を
>
> System.out.println("before update versionNo:" + dept.getVersionNo());
> dao.update(dept);
> System.out.println("after update versionNo:" + dept.getVersionNo());
> dao.update(dept);
> System.out.println("after update versionNo:" + dept.getVersionNo());
>
> こんな封に変えると、
>
> before update versionNo:0
> after update versionNo:1
> after update versionNo:2
>
> と出力されますよ。
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内