• 締切済み

SELECT FOR UPDATE で該当レコードがなかった場合

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 を排他防御できるのか無理なのか、 教えていただけたらありがたいです。 すみません、時間的余裕があまりないので、 (すぐに回答ほしいです)でアップします。

みんなの回答

回答No.1

ロックする対象がなければ、ロックのしようがありません。 インサートするレコードのキーを予約する意味での行為なら、そのような手法ではだめです。 代替え策ですが、FOR-UPDATEで存在チェック&インサート予約、その後にじっくりインサートするのでなく、 いきなりプライマリーキーだけインサートして、インサートできたなら、存在チェックOK&予約済みとし、 後でその他のデータを更新すると良いかと思います。 もし、更新を辞めたいなら、ロールバックすれば良いかと。

関連するQ&A