Table Hints 사용을 조사하는 동안 다음 두 가지 질문을 발견했습니다.
두 질문에 대한 답변은를 사용할 때 (UPDLOCK, HOLDLOCK)
다른 프로세스가 해당 테이블의 데이터를 읽을 수 없다고 말하지만 나는 이것을 보지 못했습니다. 테스트를 위해 테이블을 만들고 두 개의 SSMS 창을 시작했습니다. 첫 번째 창에서 다양한 테이블 힌트를 사용하여 테이블에서 선택한 트랜잭션을 실행했습니다. 트랜잭션이 실행되는 동안 두 번째 창에서 차단되는 것을 확인하기 위해 다양한 문을 실행했습니다.
테스트 테이블 :
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'
Window 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)
는 그것이 내가 사용해야 할 것이라고 생각 하지만 실수를했거나 나중에 나를 물기 위해 돌아올 무언가를 간과했을지도 모른다는 우려가 있습니다.