1

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

したがって、Javaコードにチェックがあります。しかし、2 つの重複する同時要求がある場合、2 つの Java スレッドはメンバーが存在しないことを認識し、両方がレコードを挿入して重複が発生します。このような重複挿入を防ぐにはどうすればよいですか?

行レベルのロックまたは Hibernate の楽観的同時実行性を使用して、更新を防ぐことができます。このような挿入を防ぐためにテーブル レベルのロックを考えることができますが、更新もブロックするため、アプリケーションのパフォーマンスが制限されます。私が考える別のオプションは、id = 'memberInsert'のレコードでロックテーブルを作成し、JDBCを介してすべての挿入を強制して、このレコードで行レベルのロックを取得することです。

ありがとう

4

2 に答える 2

3

どこかにあるとしたら、Java コードではなく、書き込みトリガーにあると思います。他のアプリケーションまたはアプリケーションの他の領域が何か悪いことをする可能性があります。

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

于 2011-11-08T21:24:00.980 に答える
1

アルゴリズムの結果などをハッシュして、それを一意の主キーとして使用することはできませんか?

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

于 2011-11-08T21:24:43.613 に答える