대기 중인 업데이트 구독은 여러 위치에서 동일한 데이터를 수정할 수 있으므로 게시자에서 데이터가 동기화될 때 충돌이 발생할 수 있습니다. 복제는 변경 내용이 게시자와 동기화될 때 충돌을 감지하고 게시를 만들 때 선택한 해결 정책을 사용하여 충돌을 해결합니다. 다음과 같은 충돌이 발생할 수 있습니다.
충돌을 업데이트 및 삽입합니다. 이 충돌은 두 위치에서 동일한 데이터가 변경될 때 발생합니다. 한 가지 변화가 승리하고 다른 하나는 패배합니다.
충돌을 삭제합니다. 이 충돌은 동일한 행이 한 위치에서 삭제되고 다른 위치에서 변경될 때 발생합니다.
충돌 감지 및 해결은 시간이 많이 걸리고 리소스를 많이 사용하는 프로세스일 수 있습니다. 따라서 다른 구독자가 서로 다른 데이터 하위 집합을 수정할 수 있도록 데이터 파티션을 만들어 애플리케이션에서 충돌을 최소화하는 것이 가장 좋습니다.
충돌 탐지
게시를 만들고 대기 중인 업데이트를 사용하도록 설정하는 경우 복제는 기본값인 newid()가 있는 uniqueidentifier 열(msrepl_tran_version)을 기본 테이블에 추가합니다. 게시자 또는 구독자에서 게시된 데이터가 변경되면 행은 새 행 버전이 있음을 나타내는 새 GUID(Globally Unique Identifier)를 받습니다. 큐 판독기 에이전트는 동기화 중에 이 열을 사용하여 충돌이 있는지 확인합니다.
큐의 트랜잭션은 이전 및 새 행 버전 값을 유지 관리합니다. 트랜잭션이 게시자에 적용되면 트랜잭션의 GUID와 게시의 GUID가 비교됩니다. 트랜잭션에 저장된 이전 GUID가 게시의 GUID와 일치하면 게시가 업데이트되고 행에 구독자가 생성한 새 GUID가 할당됩니다. 트랜잭션의 GUID를 사용하여 게시를 업데이트하면, 게시와 트랜잭션의 행 버전이 일치하게 됩니다.
트랜잭션에 저장된 이전 GUID가 게시의 GUID와 일치하지 않으면 충돌이 감지됩니다. 게시의 새 GUID는 두 개의 행 버전이 있음을 나타냅니다. 하나는 구독자가 제출하는 트랜잭션에 있고 다른 하나는 게시자에 존재합니다. 이 경우 다른 구독자 또는 게시자가 이 구독자 트랜잭션이 동기화되기 전에 게시에서 동일한 행을 업데이트했습니다.
병합 복제와 달리 GUID 열은 행 자체를 식별하는 데 사용되지 않지만 행이 변경되었는지 확인하는 데 사용됩니다.
충돌 해결
대기 중인 업데이트를 사용하여 게시를 만들 때 충돌이 감지되면 사용할 충돌 해결 프로그램을 선택합니다. 충돌 해결 프로그램은 큐 판독기 에이전트가 동기화 중에 발생한 동일한 행의 다른 버전을 처리하는 방법을 제어합니다. 게시에 대한 구독이 없는 한 게시를 만든 후 충돌 해결 정책을 변경할 수 있습니다. 충돌 해결 프로그램 선택은 다음과 같습니다.
게시자 우선(기본값)
게시자가 승리하고 구독이 다시 초기화됩니다.
구독자가 승리
충돌은 기록되며 충돌 뷰어를 사용하여 볼 수 있습니다.
지연 업데이트 충돌 해결 정책을 설정하려면
SQL Server Management Studio: 지연 업데이트 충돌 해결 옵션 설정(SQL Server Management Studio)
복제 Transact-SQL 프로그래밍: 거래 게시에 대한 구독 업데이트 활성화
데이터 충돌을 보려면
- SQL Server Management Studio: 트랜잭션 게시에 대한 데이터 충돌 보기(SQL Server Management Studio)
게시자의 승리
충돌 해결을 게시자가 이길 수 있도록 설정하면 게시자의 데이터를 기반으로 트랜잭션 일관성이 유지됩니다. 트랜잭션의 충돌이 발생한 경우, 해당 트랜잭션을 시작한 구독자에서 롤백됩니다.
큐 판독기 에이전트는 충돌을 감지하고 보상 명령이 생성되어 배포 데이터베이스에 게시하여 구독자에 전파됩니다. 그런 다음 배포 에이전트는 충돌하는 트랜잭션을 시작한 구독자에 보상 명령을 적용합니다. 보상 작업은 게시자의 행과 일치하도록 구독자의 행을 업데이트합니다.
보상 명령이 적용될 때까지 최종적으로 구독자에서 롤백될 트랜잭션의 결과를 읽을 수 있습니다. 이는 더티 읽기(커밋되지 않은 읽기 격리 수준)와 동일합니다. 발생할 수 있는 후속 종속 트랜잭션에 대한 보상은 없습니다. 그러나 트랜잭션 경계는 준수되며, 트랜잭션 내의 모든 작업이 커밋되거나 충돌이 발생하는 경우에 롤백됩니다.
게시자가 승리하고 구독이 다시 초기화됩니다.
충돌을 해결하기 위해 구독자를 다시 초기화하면 구독자에서 엄격한 트랜잭션 일관성이 유지되지만 게시에 대량의 데이터가 포함된 경우 시간이 오래 걸릴 수 있습니다.
큐 판독기 에이전트가 충돌을 감지하면 큐에 남아 있는 모든 트랜잭션(충돌 중인 트랜잭션 포함)이 거부되고 구독자가 다시 초기화되도록 표시됩니다. 게시에 대해 생성된 다음 스냅샷은 배포 에이전트가 구독자에 적용합니다.
구독자 승리
구독자 우선 정책에서 충돌 탐지는 마지막으로 게시자를 업데이트한 구독자의 작업이 우선된다는 것을 의미합니다. 이 경우 충돌이 감지되면 구독자가 보낸 트랜잭션이 계속 사용되고 게시자가 업데이트됩니다. 이 정책은 이러한 변경 내용이 데이터 무결성을 손상시키지 않는 애플리케이션에 적합합니다.