- PR -

SQL SERVER2000 トランザクションに関して

1
投稿者投稿内容
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2008-04-19 00:02
http://www.atmarkit.co.jp/fnetwork/rensai/sql25/sql1.html
のページでわからない点があります。

ある端末(A)からトランザクションを組んでUPDATEしている状態で
もう一方(B)の端末からSELECTを実行するとBの端末が待たされる
というものです。

違うテーブルで同じことをしてみたのですが、やはりB側が待たされてしまいます。
そこでSP_ROCKを実行すると
TYPE=RIDで排他ロックがかかっておりました。

ここまでは納得なのですが、なぜ、単一ロックしかかっていないのに端末B
でSELECT * で待ちが発生するのでしょうか?
もしかして、Aでロックされているレコードが含まれているためかと思い、
Aでロックされているレコード以外をWHERE指定したのですが、
やはり結果は返ってきませんでした。

これはテーブルロック(ロックエスカレーション??)されているのでしょうか?
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-04-19 00:47
引用:

これはテーブルロック(ロックエスカレーション??)されているのでしょうか?


いいえ、違います。

引用:

Aでロックされているレコード以外をWHERE指定したのですが、やはり結果は返ってきませんでした。


そのWHERE句に指定した条件にインデックスが設定されていない、もしくはクラスタ化インデックスが使用されたのでしょう。インデックスが使用されない場合、すべてのデータを読んでみないと条件に合致するかどうかが確認できません。つまり、Bはテーブルのすべての行を読み取る必要があります。

Bがすべての行を読み取る過程で、必ず、Aが排他ロックしている行に対しても読み取りを要求することになり、この時点でブロッキングが発生します。
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2008-04-19 11:03
ご説明ありがとうございます。
納得です。

ということはB Tree Indexがはってあり、
 今回Updateした対象の列のみSelectをかけると待ちが発生
 それ以外の場合は待ちは発生しない

という認識でいいでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)