質問するログイン新規登録
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

772閲覧

複合キーのテーブルで、該当する1レコードだけに行ロックがかからない

gigatail

総合スコア9

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2022/10/13 10:32

編集2022/10/14 04:47

0

0

前提

複合キーのテーブルで、該当する1レコードだけに行ロックがかからない

実現したいこと

テーブル:TABLE1

列1列2列3
01AA111
01BB110
01CC112
02AA113
02BB114
02CC112

上記のテーブルに対して
SELECT * FROM TABLE1 WITH(UPDLOCK,ROWLOCK) WHERE 列1='01' AND 列2='CC'
を実行すると、列1='01' の3レコードに行ロックがかかります。
(SQLServer Management Studioにてロックされているのを確認)

DB:SQLServer2019
キー項目:列1 char(2), 列2 char(2)

  • リスト実際のDB名・テーブル名・項目名を置換したCREATE文を記載します。

USE [サンプルDB]
GO

/****** Object: Table [dbo].[TABLE1] Script Date: 2022/10/14 9:36:33 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TABLE1](
[列1] char NOT NULL,
[列2] char NOT NULL,
[列3] char NULL,
CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED
(
[列1] ASC,
[列2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

発生している問題・エラーメッセージ

上記のSQLを実行すると、(列1='01' AND 列2='CC') の1レコードだけでなく、(列1='01') の3レコードにロックがかかってしまいます。 行ロックを実行するテーブルには、複合キーにするのは好ましくないのでしょうか? ご存じの方がいらっしゃれば、ご教授いただきたく思います。

該当のソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2022/10/13 14:16

実際のテーブルの定義は提示できませんか? 名称は実際のものでなくて良いので。
gigatail

2022/10/14 00:56

ご覧いただきありがとうございます。 実際のDB名・テーブル名・項目名を置換したCREATE文を記載します。 USE [サンプルDB] GO /****** Object: Table [dbo].[TABLE1] Script Date: 2022/10/14 9:36:33 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TABLE1]( [列1] [char](2) NOT NULL, [列2] [char](2) NOT NULL, [列3] [char](3) NULL, CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED ( [列1] ASC, [列2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO
sazi

2022/10/14 04:33

#こちらに書くのではなく、質問を編集して下さい。 ALLOW_PAGE_LOCKS = ON というのが気になりますね。 ひょっとして優先されていたりしないでしょうか?
gigatail

2022/10/14 08:38

お返事遅くなりました。 DBの設定についてあまり明るくないのですが、「ひょっとして優先されていたりしないでしょうか?」とは、どういう意味でしょうか?
sazi

2022/10/14 09:23

ALLOW_PAGE_LOCKS = ONでページロックするとなっているので、行ロックを指定してもより範囲の広いページロックが優先されて特定のレコードのロックになっていないのではないかという事です。
gigatail

2022/10/18 02:50

ALLOW_PAGE_LOCKS = OFF で再度テーブル作成しましたが、結果は変わりませんでした。
guest

回答1

0

自己解決

SQLServer Management Studioにて[サンプルDB]の[TABLE1]を開いて、 1.(列1='01' AND 列2='CC')のレコード 2.(列1='02' AND 列2='AA')のレコード 3.(列1='02' AND 列2='CC')のレコード の列3の値を手入力にて編集することでロックされているかを確認しておりましたが、 新しいクエリを開いてロック中に[TABLE1]を更新するSQL文(UPDATE)を実行すると、 行ロックをかけた(列1='01' AND 列2='CC')のレコードだけロックがかかっていることを 確認しました。 手抜きの確認作業が原因でお騒がせして申し訳ありませんでした。

投稿2022/10/19 01:10

gigatail

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問