0

データベース テーブルを更新するサーバー側の REST API があります。テーブルはこんな感じ

ID PubId DocUuid DocFamUuid CorrelationUuid
1   156   1A       2A            3A

一意のキーは ID であり、このサーバー側 API はすべての要求に対して一意の DocUuid を生成し、PubId に基づいて DocFamUuid と CorrelationUuid を生成しています。したがって、同じ PubId を持つすべてのドキュメントは、同じ DocFamUuid と同じ CorrelationUuid を持つことになります。

私の質問は、着信要求からの特定の pubId がデータベースに存在するかどうかを確認するためにルックアップを行っていることです。存在する場合は、最初に返された結果の docFamUuid と correlationUuid を選択します。それ以外の場合は、両方を生成して保存しますデシベルへ。現在、クラスター化されたサーバー環境があり、2 つの異なるサーバーによって 2 つの別々のドキュメントが取得され、両方が処理のスレッドを開始できます。では、この状況で望ましい動作は何ですか? 1. リクエスト 1 がサーバー 1 から残りの API に送信されます。pubId は 156 で、サービスはそれをデータベースで検索します。2. リクエスト 2 は、サーバー 2 から残りの API へのデータベースにヒットします。これにも 156 の pubId があり、db テーブルに存在しないレコードを検索します。3. リクエスト 1 は、2A の docFamUuid と 3A の correlationUuid を作成し、データベース 4 に保存します。リクエスト 2 は、2B の docFamUuid と 3B の correlationUuid も作成し、db テーブルに保存しました。そして今、私たちは2つの異なる値を持っています

ID ID PubId DocUuid DocFamUuid CorrelationUuid
1   156   1A       2A            3A
2   156   1B       2B            3B

望ましい結果は次のとおりであるため、これは間違っています。

ID ID PubId DocUuid DocFamUuid CorrelationUuid
1   156   1A       2A            3A
2   156   1B       2A            3A
4

1 に答える 1

0

これは、残りの問題というよりは並行性の問題です。データベースにある種のロック メカニズムを追加し、最後の挿入の直前に既存の pubId をチェックすることができます。競合がある場合は、サーバー側で何らかの方法で解決するか、残りのサービスから 409 CONFLICT を返すことができます。

于 2012-10-06T03:24:45.147 に答える