SQL Server 2012에서 트랜잭션 기간 동안 지정된 인덱스 값에 대한 액세스를 차단하려면 어떻게해야합니까?

마이클 J. 그레이

아래에 지정된 표를 사용하여 SQL Server 2012의 잠금 동작을 수정하여 특정 UserId열과 관련된 데이터를 선택하려는 문과 트랜잭션을 차단하려면 어떻게해야합니까?

특정 사용자의 주소를 성공적으로 변경하는 저장 프로 시저를 만들려고했습니다. 이를 위해 DeletedOn현재 날짜 로 설정하여 기존 레코드를 삭제 된 것으로 표시 합니다. 그 후 새 레코드가 삽입됩니다. 삭제 표시와 삽입 사이의 테이블에 주어진 사용자에 대해 유효한 주소가 없다는 것을 쿼리에서 볼 수 있기를 원하지 않습니다.

다른 사용자의 주소와 관련된 쿼리는 해당 사용자의 주소가 수정되지 않는 한 완료 할 수 있어야합니다.

CREATE TABLE [Address]
(
    [Id] BIGINT NOT NULL,
    [UserId] FOREIGN KEY REFERENCES [User]([Id]) NOT NULL,
    [House] CHARACTER VARYING(255) NOT NULL,
    [Street] CHARACTER VARYING(255) NOT NULL,
    [City] CHARACTER VARYING (255) NOT NULL,
    [State] CHARACTER VARYING(255) NOT NULL,
    [Zip] CHARACTER VARYING(15) NOT NULL,
    [CreatedOn] DATETIMEOFFSET NOT NULL,
    [DeletedOn] DATETIMEOFFSET NULL,

    UNIQUE([UserId], [DeletedOn]),
    CHECK(([DeletedOn] IS NULL) OR ([CreatedOn] <= [DeletedOn])),

    PRIMARY KEY([Id])
);
마이클 J. 그레이

히스토리 테이블을 사용하여이 문제를 해결했습니다. UNIQUE제약 조건은 복합으로 정의 될 때 많은 잠금 에스컬레이션을 유발 하는 것으로 보입니다 .

히스토리 테이블은 이제 특정 레코드의 모든 이전 버전을 추적하고 히스토리 삽입은 반복 가능한 읽기 트랜잭션에서 라이브 테이블 업데이트와 결합됩니다.

당신은 무엇을 알고 있습니까, 나는 전체 문제에 잘못된 방식으로 접근하고있었습니다!

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관