1

JPA楽観的ロックから始めています。次のシナリオを達成する必要があります。

ユーザーは、検討のためにいくつかの要求を出します。このリクエストにはstatusプロパティがあります。置かれたばかりの状態で、ステータスは'new'です。次に、いくつかのサービスがこのリクエストを監視し、ステータスを変更してサービスを提供できます。(ステータスは、たとえば'handling'、 *'put_back'* 、'finished'などです)。そのため、オプティミスティック ロックを使用して、現在 1 つのサービスのみが要求を処理していることを確認します。したがって、他のサービスがリクエストのステータスを「新規」から「処理中」にしようとすると、それが表示されますOptimisticLockingException「リクエストの現在のステータスが変更されました。リクエスト リストを更新してください」のような内容でサービスに通知します。それは正常に聞こえます。したがって、これは、2 つのサービスが同じ要求を同時に処理しようとする状況です。

しかし、私の特別な要件は、ユーザーがステータスを'canceled'に設定することで、いつでもリクエストをキャンセルできることです。したがってOptimisticLockingException、この場合も例外が発生する可能性があります。しかし、私はそれを必要としません。したがって、リクエストはキャンセルされません。ここでは、他の誰かによって変更されたかどうかに関係なく、ステータスを「キャンセル済み」にしたいと考えています。ユーザーにリクエストを再度キャンセルするように依頼するべきではないと思います。

私の質問は次のとおりです。永続化のために使用しているEclipseLink 2.4.1でこの状況をどのように処理できますか。

注:私はJPAの楽観的ロックを初めて使用するので、何かを見逃す可能性があります。そうであれば修正してください。

4

1 に答える 1

0

私はあなたのアプリケーションでこれを処理します。cancelRequest() 操作でロック例外が発生した場合は、例外をキャッチして、コミットされるまでトランザクションを再試行してください。

ロックバージョンをチェックしないため、JPQL 更新クエリを使用することもできます。

于 2013-04-01T14:38:40.347 に答える