UPDLOCK, HOLDLOCK에 대해 혼란 스러움
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)
는 그것이 내가 사용해야 할 것이라고 생각 하지만 실수를했거나 미래에 나를 물기 위해 돌아올 무언가를 간과했을지도 모른다는 우려가 있습니다.
UPDLOCK 블록이 선택하는 이유는 무엇입니까? 잠금 호환성 매트릭스는 명확 쇼 N
에서와 S / U와 U / S 경쟁에 대한 충돌 .
에 관해서는 HOLDLOCK 문서 상태를 힌트 :
HOLDLOCK : SERIALIZABLE과 동일합니다. 자세한 내용은이 항목 뒷부분의 SERIALIZABLE을 참조하십시오.
...
SERIALIZABLE : ... SERIALIZABLE 격리 수준에서 실행되는 트랜잭션과 동일한 의미로 스캔이 수행됩니다.
그리고 트랜잭션 격리 수준의 주제는 무엇 SERIALIZABLE 방법을 설명합니다 :
다른 트랜잭션은 현재 트랜잭션이 완료 될 때까지 현재 트랜잭션에서 읽은 데이터를 수정할 수 없습니다.
다른 트랜잭션은 현재 트랜잭션이 완료 될 때까지 현재 트랜잭션의 문에서 읽은 키 범위에 속하는 키 값이있는 새 행을 삽입 할 수 없습니다.
따라서 표시되는 동작은 제품 설명서에 완벽하게 설명되어 있습니다.
- UPDLOCK은 동시 SELECT 또는 INSERT를 차단하지 않지만 T1이 선택한 행의 UPDATE 또는 DELETE를 차단합니다.
- HOLDLOCK은 SERALIZABLE 의미하므로 SELECTS을 허용하지만, 블록 UPDATE 및 T1에 의해 선택된 행의 삭제 뿐만 아니라 T1에 의해 선택되는 범위의 모든 INSERT (전체 테이블이며, 따라서 임의의 인서트).
- (UPDLOCK, HOLDLOCK): your experiment does not show what would block in addition to the case above, namely another transaction with UPDLOCK in T2:
SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
- TABLOCKX no need for explanations
The real question is what are you trying to achieve? Playing with lock hints w/o an absolute complete 110% understanding of the locking semantics is begging for trouble...
After OP edit:
I would like to select rows from a table and prevent the data in that table from being modified while I am processing it.
The you should use one of the higher transaction isolation levels. REPEATABLE READ will prevent the data you read from being modified. SERIALIZABLE will prevent the data you read from being modified and new data from being inserted. Using transaction isolation levels is the right approach, as opposed to using query hints. Kendra Little has a nice poster exlaining the isolation levels.
UPDLOCK is used when you want to lock a row or rows during a select statement for a future update statement. The future update might be the very next statement in the transaction.
Other sessions can still see the data. They just cannot obtain locks that are incompatiable with the UPDLOCK and/or HOLDLOCK.
You use UPDLOCK when you wan to keep other sessions from changing the rows you have locked. It restricts their ability to update or delete locked rows.
You use HOLDLOCK when you want to keep other sessions from changing any of the data you are looking at. It restricts their ability to insert, update, or delete the rows you have locked. This allows you to run the query again and see the same results.
참고URL : https://stackoverflow.com/questions/7843733/confused-about-updlock-holdlock
'Nice programing' 카테고리의 다른 글
추상 클래스보다 특성을 사용하는 장점은 무엇입니까? (0) | 2020.10.05 |
---|---|
실용적인 자바 스크립트 객체 지향 디자인 패턴의 예 (0) | 2020.10.05 |
외부 앱이 영구 모델 (서버 데이터베이스)을 변경 한 경우 AngularJS가 뷰를 자동 업데이트 할 수 있습니까? (0) | 2020.10.05 |
JavaScript에서 직접 PDF 인쇄 (0) | 2020.10.05 |
AngularJS에서 격리 된 범위 지시문을 단위 테스트하는 방법 (0) | 2020.10.05 |