고급 병합 복제 충돌 - 논리적 레코드에서 해결
적용 대상: SQL Server
이 항목에서는 논리적 레코드를 사용할 때 가능한 충돌 감지 및 충돌 해결 방법의 다양한 조합에 대해 설명합니다. 병합 복제의 충돌은 둘 이상의 노드가 동일한 데이터를 변경하거나 병합 복제에서 변경 내용을 복제할 때 제약 조건 위반과 같은 특정 유형의 오류가 발생할 때 발생합니다. 충돌 감지 및 해결에 대한 자세한 내용은 Advanced Merge Replication Conflict Detection and Resolution을 참조하십시오.
아티클에 대한 충돌 추적 및 해결 수준을 지정하려면 병합 복제 옵션 수정을 참조하세요.
충돌 감지
논리적 레코드에 대해 충돌이 검색되는 방법은 두 가지 아티클 속성인 column_tracking 및 logical_record_level_conflict_detection에 따라 결정됩니다. SQL Server 2005(9.x) 이상 버전도 논리적 레코드 수준 검색을 지원합니다.
logical_record_level_conflict_detection 아티클 속성은 TRUE 또는 FALSE로 설정할 수 있습니다. 이 값은 최상위 부모 아티클에 대해서만 설정해야 하며 자식 아티클에서는 무시됩니다. 이 값이 FALSE이면 병합 복제는 아티클의 column_tracking 속성 값만을 기반으로 이전 버전의 SQL Server에서와 같이 충돌을 검색합니다. 이 값이 TRUE이면 병합 복제는 아티클의 column_tracking 속성을 무시하고 논리적 레코드의 아무 곳에서나 변경이 수행되면 충돌을 감지합니다. 예를 들어 다음 시나리오를 고려합니다.
두 사용자가 Customers, Orders 또는 OrderItems 테이블에서 Customer2 논리적 레코드의 값을 변경하면 충돌이 감지됩니다. 이 예제에는 UPDATE 문을 통해 변경된 내용이 포함되지만 INSERT 또는 DELETE 문을 사용한 변경 내용으로 충돌을 감지할 수도 있습니다.
충돌 해결
기본적으로 병합 복제는 우선 순위 기반 논리를 사용하여 충돌을 해결합니다. 두 구독자 데이터베이스에서 충돌하는 변경이 발생하는 경우 구독 우선 순위가 높은 구독자의 변경 내용이 적용되거나 우선 순위가 같으면 게시자에 도달하는 첫 번째 변경 내용이 적용됩니다. 행 수준 및 열 수준 검색을 사용하면 전체 승리 행이 항상 손실된 행을 덮어씁니다.
logical_record_level_conflict_resolution 아티클 속성은 TRUE 또는 FALSE로 설정할 수 있습니다. 이 값은 최상위 부모 아티클에 대해서만 설정해야 하며 자식 아티클에서는 무시됩니다. 값이 TRUE이면 성공한 전체 논리적 레코드가 손실된 논리적 레코드를 덮어씁니다. FALSE인 경우 개별 적용 행은 다른 구독자 또는 게시자에서 올 수 있습니다. 예를 들어 충돌 시 Orders 테이블의 행에서는 구독자 A 내용이 적용되고 OrderItems 테이블의 관련 행에서는 구독자 B 내용이 적용될 수 있습니다. 결과는 구독자 A의 Orders 행과 구독자 B의 OrderItems 행이 있는 논리적 레코드입니다.
충돌 해결 설정과 충돌 감지 설정 간의 상호 작용
충돌의 결과는 충돌 검색 및 해결 설정의 상호 작용에 따라 달라집니다. 아래 예제에서는 우선 순위 기반 충돌 해결이 사용되고 있다고 가정합니다. 논리적 레코드를 사용하는 경우 다음과 같은 가능성이 있습니다.
행 또는 열 수준 검색, 행 수준 해결
열 수준 검색, 논리적 레코드 해결
행 수준 검색, 논리적 레코드 해결
논리적 레코드 감지, 논리적 레코드 해결
행 또는 열 수준 검색, 행 수준 해결
이 예제에서 게시는 다음으로 구성됩니다.
column_tracking 을 TRUE 또는 FALSE로 설정
logical_record_level_conflict_detection은 FALSE입니다
logical_record_level_conflict_resolution은 FALSE입니다
이 경우 검색은 행 또는 열 수준에 있고 해상도는 행 수준에 있습니다. 이러한 설정은 논리적 레코드에 대한 모든 변경 내용이 단위로 복제되지만 논리적 레코드 수준에서 충돌 검색 또는 해결이 없는 경우를 활용하는 데 사용됩니다.
열 수준 검색, 논리적 레코드 해결
이 예제에서 게시는 다음으로 구성됩니다.
column_tracking을 TRUE로 설정
logical_record_level_conflict_detection은 FALSE입니다
logical_record_level_conflict_resolution은 TRUE입니다
게시자와 구독자는 동일한 데이터 집합으로 시작하고 주문 테이블과 고객 테이블 간에 논리적 레코드가 정의됩니다. 게시자는 customers 테이블에서 custcol1 열을 변경하고 orders 테이블에서 ordercol1 열을 변경합니다. 구독자는 customers 테이블의 동일한 행에서 custcol1 열을 변경하고 orders 테이블의 동일한 행에서 ordercol2 열을 변경합니다. customer 테이블의 동일한 열이 변경되면 충돌이 발생하지만 orders 테이블의 변경 내용은 충돌하지 않습니다.
논리적 레코드 수준에서 충돌이 해결되므로 복제 처리 중 게시자에서 적용되는 변경 내용이 구독자 테이블에서의 변경 내용을 바꿉니다.
행 수준 검색, 논리적 레코드 해결
이 예제에서 게시는 다음으로 구성됩니다.
column_tracking을 FALSE로 설정
logical_record_level_conflict_detection은 FALSE입니다
logical_record_level_conflict_resolution은 TRUE입니다
게시자와 구독자는 동일한 데이터 집합으로 시작합니다. 게시자가 customers 테이블의 custcol1 열을 변경합니다. 구독자는 customers 테이블의 동일한 행에서 custcol2 열을 변경하고 orders 테이블의 동일한 행에서 ordercol2 열을 변경합니다. customers 테이블의 동일한 행이 변경되면 충돌이 발생하지만 orders 테이블의 구독자 변경 내용은 충돌하지 않습니다.
논리적 레코드 수준에서 충돌이 해결되므로 동기화 중 게시자에서 적용되는 변경 내용이 구독자 테이블에서의 변경 내용을 바꿉니다.
논리적 레코드 감지, 논리적 레코드 해결
이 예제에서 게시는 다음으로 구성됩니다.
logical_record_level_conflict_detection은 TRUE입니다
logical_record_level_conflict_resolution은 TRUE입니다
게시자와 구독자는 동일한 데이터 집합으로 시작합니다. 게시자가 customers 테이블의 custcol1 열을 변경합니다. 구독자는 orders 테이블의 ordercol1 열을 변경합니다. 동일한 행 또는 열은 변경되지 않지만 custid=1에 대해 동일한 논리적 레코드에서 변경 내용이 적용되므로 변경 내용이 논리적 레코드 수준에서 충돌로 검색됩니다.
논리적 레코드 수준에서 충돌도 해결되므로 동기화 중 게시자에서 적용되는 변경 내용이 구독자 테이블에서의 변경 내용을 바꿉니다.