0

スプリングレストコントローラーによって呼び出されているシングルトンスプリングサービスがあります。

シングルトン サービスには、次の実装を持つMyServiceメソッドがあります。addRecordIfNotExistsBefore

public void addRecordIfNotExistsBefore(String record){

    boolean isExist = checkIfRecordNotExitsBefore();

    if (!isExist){
        addRecordToDb(record);
    }
}

問題は、明らかなように、2 つのクライアントが同時に同じサービスを要求すると、レコードがデータベースに 2 回追加されることです。

次のような簡単な実装で、ダブルチェックのイディオムを適用できます。

public void addRecordIfNotExistsBefore(String record){

    boolean isExist = checkIfRecordNotExitsBefore();

    if (!isExist){
        synchoronized(this){

            isExist = checkIfRecordNotExitsBefore();
            if (!isExist){
                addRecordToDb(record);
            }
        }
    }
}

それは有効な解決策ですか、それとも別のより良い解決策がありますか?

4

1 に答える 1

2

唯一の解決策は、アプリケーションがマルチノードにデプロイされているデータベースシーンでレコードの一意性をチェックするデータベース制約を設定することだと思います

于 2015-06-04T06:34:27.623 に答える