2011-11-08 14 views
1

これは、Webアプリケーション/ Webサービスを介したメンバー登録のユースケースです。電話、住所などの複数の表を見て、メンバーが重複しているかどうかを確認するための複雑なアルゴリズムがあります。アルゴリズムはメンバーの国によって異なります。したがって、この制約は、主キー/一意キー制約を使用して実装することはできません。Oracleのユニークキーを使用せずに重複挿入を防止する

Javaコードでチェックしています。しかし、2つの同時リクエストが重複している場合、2つのJavaスレッドはメンバーが存在しないことを確認し、両方がレコードを挿入して重複していることを確認します。このような重複挿入を防止するにはどうすればよいですか?

私は、行レベルのロックやHibernateの楽観的な並行性を使用して更新を防ぐことができます。このような挿入を防ぐためにテーブルレベルのロックを考えることはできますが、更新をブロックする際にアプリケーションのパフォーマンスが制限されます。もう一つの選択肢は、id = 'memberInsert'のレコードを持つロックテーブルを作成し、このレコードの行レベルロックを取得するためにJDBC経由ですべての挿入を強制することだと思います。

おかげ Suneel

+0

メンバーが重複しているかどうかを最初に確認してから、複数のスレッドを開始して、その知識に基づいて複数のことを行うことができます。 – rid

+0

これらの要求は、Webブラウザ、Webサービスクライアントから取得できます。したがって、リクエストスレッドの作成は私のコントロールではありません。 – Suneel

+0

最終的なテーブルに固有の制約がありますか?私は、あなたが複数のソースをチェックして完全性を確認しなければならない部分を理解しています。 – r0ast3d

答えて

3

それはどこかになるだろう場合、私はそれがないJavaコードで、ライトトリガであることを期待したいです。他のアプリケーションやアプリケーションの他の領域では、何か悪いことが起こる可能性があります。

これをデータベースにオフロードすると、2つの利点があります。 1)あなたがそこで言及している競合状態を防ぎます.2)誤ったアプリケーションが違法な状態に置いたレコードを変更することを許可しないことによって、データの完全性を保護します。

+0

+1ナイスな解決策。彼らはOracle上にいるので、Javaコードを使用することさえできるかもしれません。 :) –

1

アルゴリズムの結果をハッシュして、それをユニークなプライマリキーとして使用することはできませんか?

データベースがあなたの要件を認識していない限り、それはあなたを助けません。そして、あなたはおそらく、テーブルレベルのロック以外の選択肢はありません。

+0

ハッシュを使用することについて興味深いアイデア。決して私には起こらなかった。 – Suneel

関連する問題