programing

TABLOCK vs TAB록X

easyjava 2023. 4. 9. 22:30
반응형

TABLOCK vs TAB록X

TABLOCK ★★★★★★★★★★★★★★★★★」TABLOCKX

http://msdn.microsoft.com/en-us/library/ms187373.aspx 에서는 다음과 같이 기술되어 있습니다.TABLOCK입니다.TABLOCKX전용 잠금 장치입니다.첫번번 덱덱덱 덱??? ???그리고 자물쇠를 공유하는 개념은 무엇일까요?

많이 나요.TABLOCK'공유'잡으려고 '공유' 잠금을 잡으려고 합니다.TABLOCKX전용 잠금 장치

트랜잭션 중에 테이블에서 배타적 잠금을 잡는 경우, 예:

SELECT 1 FROM TABLE WITH (TABLOCKX)

다른 프로세스는 테이블의 잠금을 잡을 수 없습니다., 테이블과 대화를 시도하는 모든 쿼리는 트랜잭션이 커밋될 때까지 차단됩니다.

TABLOCK하고, 분리가 「」인 , 됩니다.READ COMMITTED(디폴트).분리 수준이 더 높은 경우, 예를 들어 다음과 같습니다.SERIALIZABLE 잠금은 시까지


유유 、 ,, 、 다,다 다다다 다다에서 S IS 하고 있는 (「」를 통해) 2개의 를 읽을 수 .TABLOCK ,의 transaction A 유지, " " " " 。transaction B모든 공유 잠금이 해제될 때까지 배타적 잠금을 잡을 수 없습니다.msdn에서 어떤 잠금이 어떤 잠금과 호환되는지 확인.


두 힌트 모두 DB가 행 또는 페이지 수준 잠금과 같은 보다 세분화된 잠금을 사용하지 않도록 합니다.원칙적으로 더 세분화된 잠금을 통해 더 나은 동시성을 실현할 수 있습니다.예를 들어, 한 트랜잭션은 테이블의 행 100을 업데이트하고 다른 트랜잭션은 두 트랜잭션에서 동시에 행 1000을 업데이트할 수 있습니다(페이지 잠금이 까다롭지만 건너뜁니다).

일반적으로 세밀한 잠금이 필요하지만 특정 작업의 성능을 높이고 교착 상태를 제거할 수 있도록 DB 동시성을 줄이고 싶을 수 있습니다.

으로는 사용하지 .TABLOCK ★★★★★★★★★★★★★★★★★」TABLOCKX꼭 필요한 경우가 아니라면 말이야

mssqlcity에 관한 오래된 기사에서 잠금 유형을 설명하려고 합니다.

공유 잠금은 SELECT 문과 같이 데이터를 변경하거나 업데이트하지 않는 작업에 사용됩니다.

업데이트 잠금은 SQL Server가 페이지를 수정하려는 경우 사용되며, 나중에 업데이트 페이지 잠금을 실제로 변경하기 전에 전용 페이지 잠금으로 승격합니다.

UPDATE, INSERT 또는 DELETE와 같은 데이터 수정 작업에는 배타적 잠금이 사용됩니다.

여기서는 의도(기본적으로 이러한 잠금 유형의 수식어)에 대해서는 설명하지 않습니다.의도(공유/전용) 잠금은 실제 잠금보다 높은 수준으로 유지되는 잠금입니다.예를 들어 트랜잭션의 행에 X 잠금이 있는 경우 테이블레벨에 IX 잠금이 있습니다(다른 트랜잭션에서는 트랜잭션이 완료되거나 롤백될 때까지 테이블의 상위 레벨에서 호환되지 않는 잠금(예를 들어 스키마 수정 잠금)을 얻으려고 시도하지 않습니다).


잠금을 "공유"하는 개념은 매우 간단합니다. 여러 트랜잭션이 동일한 리소스에 대해 공유 잠금을 가질 수 있지만, 단일 트랜잭션에만 배타적 잠금이 있을 수 있으며, 배타적 잠금은 모든 트랜잭션이 공유 잠금을 얻거나 보유하는 것을 방지합니다.

이것은 TAB의 예에 가깝습니다.LOCK이 동작하지 않아 Tab이 동작하지 않는다.LOCKX가 했어요.

2개의 세션이 있으며 둘 다 기본(READ COMMITED) 분리 수준을 사용합니다.

세션 1은 링크된 서버에서 데이터베이스 내의 테이블 세트로 데이터를 복사하는 명시적인 트랜잭션입니다.실행하는 데 몇 초 걸립니다.[예, 질문 삭제]세션 2는 삽입문으로, 세션 1이 변경하지 않는 테이블에 행을 삽입하기만 하면 됩니다.[예, 답변 삽입]

(실제에서는 세션1이 트랜잭션을 실행하고 있는 동안 여러 개의 레코드가 동시에 테이블에 삽입되는 세션이 여러 개 존재합니다).

세션 1은 세션2에 의해 추가된 엔트리에 의존하는 레코드를 삭제할 수 없기 때문에 세션2가 삽입하는 테이블을 조회해야 합니다.[예:답변되지 않은 질문은 삭제합니다.

따라서 세션1이 실행 중이고 세션2가 삽입을 시도하고 있는 동안 세션2는 매번 교착 상태가 됩니다.

따라서 세션1의 delete 문은 다음과 같습니다.DELETE tblA FROM tblQ LEFT JOIN tblX on ...좌측 결합 TBLA ON TBLQ.Qid = tblA.QID WHERE...aQID는 무효이며...

세션 2, [3, 4, 5, ..., n]가 tblA에 삽입을 시도하는 동안 tblA에 대한 쿼리 간의 경합이 교착 상태를 야기하는 것으로 보입니다.

제 경우 세션 1 트랜잭션의 분리 수준을 직렬로 변경할 수 있습니다.이렇게 했을 때:트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용하지 않도록 설정했습니다.

따라서 이 문제를 피하기 위해 여기 제시된 답변의 지침을 따를 수 있습니다.트랜잭션 관리자가 원격/네트워크 트랜잭션에 대한 지원을 사용하지 않도록 설정했습니다.

하지만 a) 애초에 격리 레벨을 시리얼 가능으로 변경하는 것이 마음에 들지 않았습니다.퍼포먼스를 저하시켜 다른 결과를 초래할 수도 있습니다.b) 이렇게 하면 링크된 서버 간에 갑자기 트랜잭션에 문제가 생기는 이유를 이해할 수 없었습니다.c) 네트워크 액세스를 유효하게 함으로써 어떤 구멍을 열 수 있는지 알 수 없습니다.

매우 큰 트랜잭션에서 문제의 원인이 되는 쿼리가 6개밖에 없었던 것 같습니다.

그래서 TAB에 대해서 읽었어요.LOCK 및 TabLOCKX.

나는 그 차이점에 대해 명확하지 않았고 둘 다 효과가 있을지 몰랐다.하지만 그럴 것 같았어.처음에 TAB을 시도했습니다.록이랑 별 차이가 없는 것 같았어.경합하는 세션에서도 같은 데드록이 발생했습니다.그리고 TAB을 시도했다.LOCKX, 그리고 더 이상 교착상태는 없습니다.

6개소에서 WITH(TABLOCKX)만 추가하면 되었습니다.

따라서 세션1의 delete 문은 다음과 같습니다.DELETE tblA FROM tblQ q LEFT JOIN tblX x on ...TBLQ에서 TBLA A(TABLOCKX)를 왼쪽 결합합니다.Qid = tblA.QID WHERE...aQID는 무효이며...

언급URL : https://stackoverflow.com/questions/5102152/tablock-vs-tablockx

반응형