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