備忘録

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SELECT FOR UPDATE対象が別セッションで更新され、条件に合わなくなったらどうなるか?

1.セッションA で SELECT FOR UPDATE
  副問い合わせで最大値を求めそれを取得。値が10,20とあったら、20のレコードをロックされる。
2.セッションB で同条件で SELECT FOR UPDATE
  同じく値20のレコードを待つ。
3.セッションA で、2.の条件に合わない
  20→0と値を変更しコミット。
4.セッションB ではどうなるか?

値10のレコードが取れるか?データなしとなるか?
結果は、データなしとなる。
まあ、考えればわかる。
10を返そうとするには、副問い合わせを再実行しないといけない。
下手すれば無限ループ。

以下、試した結果。


-- ↓準備
create table T ( C number);
insert into t values (10);
insert into t values (20);
commit;
-- ↑準備

-- ↓セッションA
select * from t
where c = (select max(c) from t)
for update;
-- ↑セッションA

-- ↓セッションB
SQL> select * from t
2 where c = (select max(c) from t)
3 for update;
-- ↑セッションB

-- ↓セッションA
update t set c=0 where c = 20;
commit;
-- ↑セッションA

-- ↓セッションB
レコードが選択されませんでした。
-- ↑セッションB

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://ncdkayak.blog.fc2.com/tb.php/39-fae72f5e
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。