[Seasar-user:13138] Re: VersionNoによる排他制御の値のインクリメントについて

kubo [E-MAIL ADDRESS DELETED]
2008年 3月 3日 (月) 20:17:09 JST


久保です。

瀧さん、ありがとうございました。
単純に他のユーザの人が
「俺のシステム大丈夫なのかな!?」
って思うかもしれないので明確にしておきたかっただけです。

2008/3/3 Minoru Taki <[E-MAIL ADDRESS DELETED]>:
> 久保さん
>
>  瀧です。
>
>  お世話になります。
>
>  > こちらの件、他のユーザのためにも問題領域を明確にしておきたいのですが、
>  > ユーザAの1回目のリクエストと2回目のリクエストで同じEntityインスタンスを
>  > 共有した場合にのみ発生する現象と考えてよろしいでしょうか?
>
>  その通りです。
>
>
>  > また、別のやり方で:
>  > 更新画面の表示時にVersionNoのみをセッション上に保持して、
>  > 更新ボタンが押されたら、該当レコードを再検索してそのEntityに
>  > 画面入力項目(変更項目)とセッション上のVersionNoを
>  > 設定してupdate()を実行、
>  > というようなやり方の場合は発生しないと認識しています。
>  > (もしくはModifiedProperties機能を使って、更新時は
>  > Entityインスタンスを新たにnewして設定してupdate())
>
>   この場合ですと、厳密にやるのであればselect時にfor updateすることになると思いますが、
>  そのためにSQLを作るとなると、自動生成SQLの旨みが薄れるので・・・。
>  なるべく前者で実施したいです。
>
>
>  ----- Original Message -----
>  From: "kubo" <[E-MAIL ADDRESS DELETED]>
>  To: <[E-MAIL ADDRESS DELETED]>
>
>
> Sent: Monday, March 03, 2008 7:30 PM
>  Subject: [Seasar-user:13134] Re:VersionNoによる排他制御の値のインクリメントについて
>
>
>  > 久保です。
>  >
>  > こちらの件、他のユーザのためにも問題領域を明確にしておきたいのですが、
>  > ユーザ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 mailing list
>  > [E-MAIL ADDRESS DELETED]
>  > https://ml.seasar.org/mailman/listinfo/seasar-user
>  >
>
>  _______________________________________________
>  Seasar-user mailing list
>  [E-MAIL ADDRESS DELETED]
>  https://ml.seasar.org/mailman/listinfo/seasar-user
>


Seasar-user メーリングリストの案内