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

Minoru Taki [E-MAIL ADDRESS DELETED]
2008年 3月 3日 (月) 20:09:28 JST


久保さん

 瀧です。

 お世話になります。

> こちらの件、他のユーザのためにも問題領域を明確にしておきたいのですが、
> ユーザ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 メーリングリストの案内