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

質問

QNo.3549816 SELECT FOR UPDATE で該当レコードがなかった場合
質問者:rrqbq SELECT FOR UPDATE
ですが、該当レコードのみ
ロックすると思うんですが、
該当レコードがない場合は、
ロックできないんでしょうか?

たとえば、(COLUMN_BBB が PK として)

SELECT * FROM TABLE_AAA
WHERE TABLE_AAA.COLUMN_BBB = 'BBB'
FOR UPDATE

で、そもそも

SELECT * FROM TABLE_AAA
WHERE TABLE_AAA.COLUMN_BBB = 'BBB'

となるレコードがない場合でも、
他トランザクションによる
該当レコードの INSERT を排他防御できるのか無理なのか、
教えていただけたらありがたいです。

すみません、時間的余裕があまりないので、
(すぐに回答ほしいです)でアップします。
困り度:
  • すぐに回答を!
質問投稿日時:
07/11/26 23:28

回答

ANo.1 ロックする対象がなければ、ロックのしようがありません。
インサートするレコードのキーを予約する意味での行為なら、そのような手法ではだめです。

代替え策ですが、FOR-UPDATEで存在チェック&インサート予約、その後にじっくりインサートするのでなく、
いきなりプライマリーキーだけインサートして、インサートできたなら、存在チェックOK&予約済みとし、
後でその他のデータを更新すると良いかと思います。
もし、更新を辞めたいなら、ロールバックすれば良いかと。
回答者:k_o_r_o_c_h_a_n
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
07/11/27 01:32
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)