■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 レコードのロックとインデックスは密接に関係してますか。 詳しい方は、説明お願いします。
|
|