テーブルヒントの使用法を調査しているときに、次の2つの質問に遭遇しました。
両方の質問への回答は、を使用すると(UPDLOCK, HOLDLOCK)
、他のプロセスがそのテーブルのデータを読み取ることができないと言っていますが、私はこれを見ませんでした。テストするために、テーブルを作成し、2つのSSMSウィンドウを起動しました。最初のウィンドウから、さまざまなテーブルヒントを使用してテーブルから選択したトランザクションを実行しました。トランザクションの実行中に、2番目のウィンドウからさまざまなステートメントを実行して、どれがブロックされるかを確認しました。
テストテーブル:
CREATE TABLE [dbo].[Test](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Value] [nvarchar](50) NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
SSMSウィンドウ1から:
BEGIN TRANSACTION
SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
SSMSウィンドウ2から(次のいずれかを実行):
SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'
DELETE dbo.Test WHERE Value= 'baz'
ウィンドウ2で実行されるステートメントに対するさまざまなテーブルヒントの影響。
(UPDLOCK) (HOLDLOCK) (UPDLOCK, HOLDLOCK) (TABLOCKX)
---------------------------------------------------------------------------
SELECT not blocked not blocked not blocked blocked
INSERT not blocked blocked blocked blocked
UPDATE blocked blocked blocked blocked
DELETE blocked blocked blocked blocked
これらの質問の答えを誤解したり、テストを間違えたりしましたか?ない場合は、なぜあなたは使用する(UPDLOCK, HOLDLOCK)
対(HOLDLOCK)
一人で?
私が達成しようとしていることのさらなる説明:
テーブルから行を選択し、処理中にそのテーブルのデータが変更されないようにしたいのですが。私はそのデータを変更しておらず、読み取りが発生することを許可したいと思います。
この答えは、それ(UPDLOCK, HOLDLOCK)
が読み取りをブロックすることを明確に示しています(私が望むものではありません)。この回答に対するコメントは、それがHOLDLOCK
読み取りを妨げることを意味します。表のヒントの効果をよりよく理解し、UPDLOCK
単独で私が望むことを実行できるかどうかを確認するために、上記の実験を行い、それらの答えと矛盾する結果を得ました。
今(HOLDLOCK)
はそれを使うべきだと思いますが、間違えたり、見落としたりして、また噛み付くのではないかと心配しているので、この質問です。