피어 투 피어 트랜잭션 복제를 사용하면 토폴로지의 모든 노드에서 데이터를 삽입, 업데이트 또는 삭제하고 데이터 변경 내용을 다른 노드로 전파할 수 있습니다. 모든 노드에서 데이터를 변경할 수 있으므로 다른 노드의 데이터 변경 내용이 서로 충돌할 수 있습니다. 행이 둘 이상의 노드에서 수정되면 행이 다른 노드로 전파될 때 충돌 또는 업데이트 손실이 발생할 수 있습니다.
SQL Server 2008 이상 버전에서 피어 투 피어 복제는 피어 투 피어 토폴로지에서 충돌 검색을 사용하도록 설정하는 옵션을 제공합니다. 이 옵션은 일관되지 않은 애플리케이션 동작 및 업데이트 손실을 포함하여 검색되지 않은 충돌로 인해 발생하는 문제를 방지하는 데 도움이 됩니다. 이 옵션을 사용하도록 설정하면 기본적으로 충돌하는 변경 내용이 배포 에이전트의 오류를 유발하는 심각한 오류로 처리됩니다. 충돌이 발생할 경우 토폴로지는 충돌이 해결되고 토폴로지 전체에서 데이터가 일관될 때까지 일관성 없는 상태로 유지됩니다.
비고
잠재적인 데이터 불일치를 방지하려면 충돌 검색이 설정된 경우에도 피어 투 피어 토폴로지에서 충돌을 방지해야 합니다. 특정 행에 대한 쓰기 작업이 하나의 노드에서만 수행되도록 하려면 데이터에 액세스하고 변경하는 애플리케이션은 삽입, 업데이트 및 삭제 작업을 분할해야 합니다. 이렇게 분할하면 행이 다른 노드에서 수정되기 전에 한 노드에서 발생하는 지정된 행에 대한 수정이 토폴로지의 다른 모든 노드와 동기화됩니다. 애플리케이션에 정교한 충돌 감지 및 해결 기능이 필요한 경우 병합 복제를 사용합니다. 자세한 내용은 병합 복제 및 병합 복제 충돌 검색 및 해결을 참조하세요.
갈등 및 갈등 탐지 이해
단일 데이터베이스에서 다른 애플리케이션에서 동일한 행을 변경해도 충돌이 발생하지 않습니다. 트랜잭션이 직렬화되고 잠금이 동시 변경 내용을 처리하는 데 사용되기 때문입니다. 피어 투 피어 복제와 같은 비동기 분산 시스템에서 트랜잭션은 각 노드에서 독립적으로 작동합니다. 여러 노드에서 트랜잭션을 직렬화하는 메커니즘이 없습니다. 2단계 커밋과 같은 프로토콜을 사용할 수 있지만 성능에 큰 영향을 줍니다.
피어 투 피어 복제와 같은 시스템에서는 개별 피어에서 변경 내용이 커밋될 때 충돌이 감지되지 않습니다. 대신 이러한 변경 내용이 복제되어 다른 피어에서 적용될 때 검색됩니다. 피어 투 피어 복제에서는 게시된 각 테이블의 숨겨진 열을 기반으로 각 노드에 변경 내용을 적용하는 저장 프로시저에서 충돌을 감지합니다. 이 숨겨진 열은 각 노드 및 행의 버전에 대해 지정하는 시작자 ID 를 결합하는 ID를 저장합니다. 동기화하는 동안 배포 에이전트는 각 테이블에 대한 프로시저를 실행합니다. 이러한 절차는 다른 피어의 삽입, 업데이트 및 삭제 작업을 적용합니다. 숨겨진 열 값을 읽을 때 프로시저 중 하나가 충돌을 감지하면 심각도 수준이 16인 오류 22815가 발생합니다.
A conflict of type '%s' was detected at peer %d between peer %d (incoming), transaction id %s and peer %d (on disk), transaction id %s
기본적으로 이 오류로 인해 배포 에이전트가 해당 노드에 변경 내용 적용을 중지합니다. 검색된 충돌을 처리하는 방법에 대한 자세한 내용은 이 항목의 뒷부분에 있는 "충돌 처리"를 참조하세요.
비고
숨겨진 열은 DAC(관리자 전용 연결)를 통해 로그인한 사용자만 액세스할 수 있습니다. DAC에 대한 자세한 내용은 데이터베이스 관리자에 대한 진단 연결을 참조하세요.
피어 투 피어 복제는 다음과 같은 유형의 충돌을 감지합니다.
삽입-삽입
피어 투 피어 복제에 참여하는 각 테이블의 모든 행은 기본 키 값을 사용하여 고유하게 식별됩니다. 키 값이 같은 행이 둘 이상의 노드에 삽입된 경우 이중 삽입 충돌이 발생합니다.
연속 업데이트
둘 이상의 노드에서 동일한 행이 업데이트되었을 때 발생합니다.
삽입-업데이트
한 노드에서 행이 업데이트되었지만 동일한 행이 삭제된 다음 다른 노드에 다시 삽입된 경우에 발생합니다.
삽입-삭제
한 노드에서 행이 삭제되었지만 동일한 행이 삭제된 다음 다른 노드에 다시 삽입된 경우에 발생합니다.
업데이트-삭제
한 노드에서 행이 업데이트되었지만 다른 노드에서 동일한 행이 삭제된 경우에 발생합니다.
삭제-삭제
둘 이상의 노드에서 행이 삭제되었을 때 발생합니다.
충돌 감지 활성화
충돌 검색을 사용하려면 모든 노드에서 SQL Server 2008 이상 버전을 실행해야 합니다. 모든 노드에 대해 검색을 사용하도록 설정해야 합니다. SQL Server 2008 이상 버전에서는 기본적으로 SQL Server Management Studio에서 충돌 검색을 사용하도록 설정됩니다. 충돌이 예상되지 않는 경우에도 검출 기능을 사용 가능하도록 설정하는 것이 좋습니다. Management Studio 또는 Transact-SQL 저장 프로시저를 사용하여 충돌 감지를 활성화 및 비활성화할 수 있습니다.
Management Studio에서 게시 속성 대화 상자의 구독 옵션 페이지 또는 피어 투 피어 토폴로지 구성 마법사의 토폴로지 구성 페이지를 사용하여 검색 기능을 활성화하거나 비활성화할 수 있습니다.
Management Studio를 사용하여 충돌 검색을 구성하는 경우 충돌이 감지될 때 변경 내용 적용을 중지하도록 배포 에이전트가 구성됩니다.
다음 저장 프로시저를 사용하여 검색 기능을 활성화하거나 비활성화할 수 있습니다: sp_addpublication 또는 sp_configure_peerconflictdetection.
저장 프로시저를 사용하여 충돌 검색을 구성하는 경우 충돌이 감지될 때 배포 에이전트에서 변경 내용 적용을 중지할지 여부를 지정할 수 있습니다. 에이전트가 중지되는 것이 기본값입니다. 기본 설정을 사용하는 것이 좋습니다.
충돌 처리
피어 투 피어 복제에서 충돌이 발생하면 피어 투 피어 충돌 검색 경고가 발생합니다. 충돌이 발생할 때 알림을 받도록 이 경고를 구성하는 것이 좋습니다. 경고에 대한 자세한 내용은 복제 에이전트 이벤트에 대한 경고 사용을 참조하세요.
배포 에이전트가 중지되고 경고가 발생한 후 다음 방법 중 하나를 사용하여 발생한 충돌을 처리합니다.
필요한 데이터를 포함하는 노드의 백업에서 충돌이 감지된 노드를 다시 초기화합니다(권장되는 방법). 이 메서드는 데이터가 일관된 상태인지 확인합니다.
배포 에이전트에서 변경 내용을 계속 적용할 수 있도록 하여 노드를 다시 동기화해 봅니다.
sp_changepublication 실행: @property 매개 변수에 'p2p_continue_onconflict'을 지정하고
true매개 변수에 @value를 지정합니다.배포 에이전트를 다시 시작합니다.
충돌 뷰어를 사용하여 검색된 충돌을 확인하고 관련된 행, 충돌 유형 및 승자를 확인합니다. 충돌은 구성 중에 지정한 생성자 ID 값에 따라 해결됩니다. ID가 가장 높은 노드에서 시작된 행이 충돌에서 승리합니다. 자세한 내용은 트랜잭션 게시에 대한 데이터 충돌 보기(SQL Server Management Studio)를 참조하세요.
유효성 검사를 실행하여 충돌하는 행이 올바르게 수렴되었는지 확인합니다. 자세한 내용은 복제된 데이터의 유효성 검사를 참조하세요.
비고
이 단계 이후 데이터가 일치하지 않는 경우 우선 순위가 가장 높은 노드의 행을 수동으로 업데이트한 다음 변경 내용이 이 노드에서 전파되도록 해야 합니다. 토폴로지에서 더 이상 충돌하는 변경 내용이 없으면 모든 노드가 일관된 상태로 바뀝니다.
sp_changepublication 실행: @property 매개 변수에 'p2p_continue_onconflict'을 지정하고
false및 @value 매개 변수를 지정합니다.