[Seasar-user:13134] Re: VersionNoによる排他制御の値のインクリメントについて
kubo
[E-MAIL ADDRESS DELETED]
2008年 3月 3日 (月) 19:30:49 JST
久保です。
こちらの件、他のユーザのためにも問題領域を明確にしておきたいのですが、
ユーザAの1回目のリクエストと2回目のリクエストで同じEntityインスタンスを
共有した場合にのみ発生する現象と考えてよろしいでしょうか?
例えば、画面アプリにおいて:
更新画面の表示時に表示レコードのEntityをセッションに保持し、
更新ボタンが押されたら、そのセッション上のEntityに対して
画面入力項目(変更項目)を設定してupdate()を実行、
というようなやり方の場合です。
これなら、確かに現象が発生するかと思います。
また、別のやり方で:
更新画面の表示時にVersionNoのみをセッション上に保持して、
更新ボタンが押されたら、該当レコードを再検索してそのEntityに
画面入力項目(変更項目)とセッション上のVersionNoを
設定してupdate()を実行、
というようなやり方の場合は発生しないと認識しています。
(もしくはModifiedProperties機能を使って、更新時は
Entityインスタンスを新たにnewして設定してupdate())
もし、勘違いがあったらご指摘下さい。
2008/3/3 Toshihiro Nakamura <[E-MAIL ADDRESS DELETED]>:
> 中村(taedium)です。
>
>
> > 自動更新SQLのVersionNoのインクリメントの制御についてお伺いします。
> > 以前、[Seasar-user:10429]にて会話されている内容に関わる問題ですが、
> > 使い方によっては排他にならないケースが出てくると思いメールしました。
>
> 報告ありがとうございます。
>
>
> > この場合再実行してもエラーにしたいので、
> > (つまり、再検索して新しいVersionNoにしないと更新できないようにしたい)
> > 同じポインタのVersionNoを1インクリメントするのではなく、SQLの式を組み立てるときに
> > 1インクリメントした値を代入する仕様が望ましいのですが、[Seasar-user:10429]の仕様と
> > 相反する仕様になると思います。
> >
> > 例外が発生した場合は、業務ロジックで1戻す処理等をしなければならないでしょうか?
> > 更新時に一律インクリメントする・しないを設定するオプション等があればうれしいのですが。
> > また他に代案があればご教授願います。
>
> S2Daoが無条件にBeanのVersionNoをインクリメントしてしまうのは、
> そもそもまちがっているように思われます。
>
> NotSingleRowUpdateRuntimeExceptionをスローするときは
> インクリメントすべきではないですね。
> 瀧さんが指摘している通り、排他にならないケースが発生して
> しまいます(リトライをする処理など)。
>
> 例外が発生するときは、インクリメントしないように修正する方向で
> 検討したいと思います。
> --
> Nakamura Toshihiro <[E-MAIL ADDRESS DELETED]>
>
>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内