ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3826796 DB INSERT 時の排他制御について
質問者:cammy22 初めて投稿するものです。
Java で DB 挿入処理 (会員登録) で悩んでおります。

DB はPostgreSQL8です。
挿入しようとしている会員テーブルは以下のようなレイアウトです。
会員テーブル
 ・会員ID 主キー
 ・ログインID NOT NULL(*)
 ・メールアドレス NOT NULL(*)
 ・会員名
 ・...
※(*)にはユニーク制約を付けています。
会員IDはPostgreSQLのシーケンスで採番するため、
排他ロックは不要であると思っております。
ですが、ログインIDとメールアドレスは
ユニークであるため、排他制御して重複
チェックしなければならないと思っています。

ユニーク制約を張っているため、例外が
発生して判定するというアイデアもあるとは
思いますが、例外で重複判定するのは
できれば避けたいと思っております。

例外以外で安全に重複チェックする
場合、どのように排他制御するべきでしょうか?
そもそも、排他制御せずに重複チェックを
安全にする方法はあるのでしょうか?

ユーザーが多いサイトの場合、テーブルを
ロックすると遅くなるような気がします。

ご教授よろしくお願いいたします。
困り度:
  • 困っています
質問投稿日時:
08/03/02 18:37
この質問に対する回答は締め切られました。

回答

ANo.1 PostgreSQLをよく知らないので、言葉が多少違うかもしれません。

未使用のとあるログインIDを使いたいという人が二人同時に登録作業するケースを想定すると、更新排他は必須です。ただ、会員テーブル全体を更新排他する必要はなく、登録制御用のレコード(例えば主キー=00000)を更新排他すれば、登録処理が同時に動くことはないので十分です。

(1) 一般のリクエスト
参照排他で会員テーブルをアクセスする
(2) 登録リクエスト
00000レコードに更新排他を掛け、会員テーブルを参照排他で重複がないかチェックし、無ければインサートする。

もしかしたら、登録制御用のレコード(上記00000)は別に1レコードだけの専用テーブルを作った方が良いのかもしれません。
回答者:notnot
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/03/02 18:52
この回答へのお礼ご回答本当にありがとうございました。

登録制御用のテーブルというのは良いアイデアかもしれませんね!
これを使用すれば登録以外の処理がロックされることもないですね。

ありがとうございます。
本当に参考になりました。