C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 29 を表示中)
■13718 / )  SELECT文の共有ロックについて
□投稿者/ NORTH (17回)-(2008/02/03(Sun) 02:27:05)

分類:[データベース全般] 

2008/02/03(Sun) 02:38:15 編集(投稿者)

SQLサーバー2005

以下状況でSELECTした場合について教えて下さい。

テーブル 社員マスタ

社員コード 名前 部署コード
0001    A氏  001
0002    B氏  002
0003    C氏  003
プライマリーキーは社員コード
インデックスは
@社員コード
A部署コード
の2つ

BEGIN TRANSACTION
UPDATE 社員マスタ
SET 部署コード='004'
FROM 社員マスタ
WHERE 社員コード='0003'
ここでわざとCommitしないで社員コード'0003'のレコードに排他ロック
がかかった状況を作ります。

この状況で
SELECT *
FROM 社員マスタ
WHERE 社員コード='0002'を実行
問題なく結果が返ってくる。

SELECT *
FROM 社員マスタ
WHERE 部署コード='002'を実行
排他ロック解除まちになり結果が返ってこない。
(WITH(NOLOCK)を指定すると当然返ってくる)

質問@
上のSELECT文は結果が返ってきて下は返ってこないのは
なぜですか?上は検索キーがプライマリーキーだから?

質問A
下のSELECT文実行後のテーブルの状態は
社員コード'0001'と'0002'は共有ロック状態ですか?
もしそうだとすればなぜですか?

SQLサーバーの設定は既定です。

質問B
マネージメントスタジオでテーブルのインデックスを
作成するときオプションに
"レコードロックする"というチェックボックスがありますが
これはどういう意味ですか?ここにチェックをいれないと
アクセスしたときテーブルロックしちゃいますか?

質問C
レコードのロックとインデックスは密接に関係してますか。
詳しい方は、説明お願いします。




返信 編集キー/


管理者用

- Child Tree -