고급 병합 복제 충돌 - 논리적 레코드에서 해결Advanced Merge Replication Conflict - Resolving in Logical Record

이 항목 적용 대상: 예SQL Server없습니다Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse 이 항목에서는 논리적 레코드에서 충돌을 감지하고 해결하는 다양한 방법을 설명합니다. This topic covers the various combinations of conflict detection and conflict resolution approaches possible when using logical records. 두 개 이상의 노드에서 동일한 데이터를 변경할 때 병합 복제에서 충돌이 발생하거나 병합 복제에서 변경 내용을 복제할 때 제약 조건 위반과 같은 특정 오류 유형이 발생합니다.A conflict in merge replication occurs when more than one node changes the same data, or merge replication encounters certain types of errors, such as a constraint violation, when replicating changes. 충돌 감지 및 해결에 대한 자세한 내용은 Advanced Merge Replication Conflict Detection and Resolution을 참조하십시오.For more information about conflict detection and resolution, see Advanced Merge Replication Conflict Detection and Resolution.

아티클의 충돌 추적 및 해결 수준을 지정하려면 Specify the Conflict Tracking and Resolution Level for Merge Articles을 참조하십시오.To specify the conflict tracking and resolution level for an article, see Specify the Conflict Tracking and Resolution Level for Merge Articles.

충돌 감지Conflict Detection

논리적 레코드에 대한 충돌을 감지하는 방법은 두 가지 아티클 속성인 column_trackinglogical_record_level_conflict_detection을 확인하는 것입니다.The way in which conflicts are detected for logical records is determined by two article properties: column_tracking and logical_record_level_conflict_detection. SQL Server 2005SQL Server 2005 이상 버전에서는 논리적 레코드 수준 감지도 지원합니다. and later versions also support logical record-level detection.

logical_record_level_conflict_detection 아티클 속성은 TRUE 또는 FALSE로 설정할 수 있습니다.The logical_record_level_conflict_detection article property can be set to TRUE or FALSE. 이 값은 최상위 부모 아티클에 대해서만 설정해야 하며 자식 아티클에서는 무시됩니다.The value should only be set for the top-level parent article and will be ignored by child articles. 이 값이 FALSE이면 병합 복제에서는 이전 버전의 SQL ServerSQL Server에서처럼 아티클에 대한 column_tracking 속성 값만 기반으로 하여 충돌을 감지합니다.If this value is FALSE, merge replication detects conflicts as in previous versions of SQL ServerSQL Server, based solely on the value of the column_tracking property for the article. 이 값이 TRUE이면 병합 복제에서는 아티클의 column_tracking 속성을 무시하고 논리적 레코드가 변경된 경우 충돌을 감지합니다.If this value is TRUE, merge replication will ignore the column_tracking property of the article, and detect a conflict if changes are made anywhere in the logical record. 예를 들어 다음과 같은 시나리오를 고려할 수 있습니다.For example, consider this scenario:

값을 포함하는 3개의 테이블 논리적 레코드Three table logical record with values

두 명의 사용자가 Customers, Orders또는 OrderItems 테이블에서 Customer2 논리적 레코드에 대한 값을 변경하는 경우 충돌이 감지됩니다.A conflict is detected if two users change any values for the Customer2 logical record in the Customers, Orders, or OrderItems tables. 이 예제에서는 주로 UPDATE 문을 통해 값을 변경한 경우를 다루지만 INSERT 또는 DELETE 문을 통해 변경한 경우에도 충돌이 감지될 수 있습니다.This example involves changes made via an UPDATE statement, but the conflict can also be detected by changes made with INSERT or DELETE statements.

충돌 해결Conflict Resolution

기본적으로 병합 복제는 우선 순위 기반 논리를 사용하여 충돌을 해결합니다.By default, merge replication uses priority-based logic to resolve conflicts. 두 구독자 데이터베이스에서 변경 내용이 충돌하는 경우 구독 우선 순위가 높은 구독자에 대한 변경 내용이 우선 적용되고 우선 순위가 같으면 게시자에 첫 번째로 도달하는 변경 내용이 우선 적용됩니다.If a conflicting change is made in two Subscriber databases, the change for the Subscriber with the higher subscription priority wins, or if the priority is the same, the first change to reach the Publisher wins. 행 수준 감지와 열 수준 감지에서는 전체 적용되는 행이 무시되는 행을 항상 덮어씁니다.With row-level and column-level detection, the entire winning row always overwrites the losing row.

logical_record_level_conflict_resolution 아티클 속성은 TRUE 또는 FALSE로 설정할 수 있습니다.The logical_record_level_conflict_resolution article property can be set to TRUE or FALSE. 이 값은 최상위 부모 아티클에 대해서만 설정해야 하며 자식 아티클에서는 무시됩니다.The value should only be set for the top-level parent article and will be ignored by child articles. 값이 TRUE이면 전체 적용되는 논리적 레코드가 무시되는 논리적 레코드를 덮어씁니다.If the value is TRUE, the entire winning logical record overwrites the losing logical record. 값이 FALSE이면 행별로 다른 구독자나 게시자의 내용이 적용될 수 있습니다.If it is FALSE, individual winning rows can come from different Subscribers or Publishers. 예를 들어 충돌 시 Orders 테이블의 행에서는 구독자 A 내용이 적용되고 OrderItems 테이블의 관련 행에서는 구독자 B 내용이 적용될 수 있습니다.For example, Subscriber A could win a conflict on a row from the Orders table, and Subscriber B could win on a related row from the OrderItems table. 그 결과 논리적 레코드의 Orders 행에는 구독자 A의 내용이, OrderItems 행에는 구독자 B의 내용이 적용됩니다.The result is a logical record with the Orders row from Subscriber A and the OrderItems row from Subscriber B.

충돌 해결 설정과 충돌 감지 설정 간의 상호 작용Interaction of Conflict Resolution and Detection Settings

충돌 결과는 충돌 감지 설정과 충돌 해결 설정 간의 상호 작용에 따라 달라집니다.The outcome of conflicts depends on the interaction of conflict detection and resolution settings. 아래 예에서는 우선 순위 기반 충돌 해결이 사용된다고 가정합니다.For the examples below, it is assumed that the priority-based conflict resolution is being used. 논리적 레코드 사용 시 이 두 설정을 다음과 같이 조합하여 지정할 수 있습니다.When using logical records, the possibilities are:

  • 행 또는 열 수준 감지, 행 수준 해결Row or column level detection, row level resolution

  • 열 수준 감지, 논리적 레코드 해결Column level detection, logical record resolution

  • 행 수준 감지, 논리적 레코드 해결Row level detection, logical record resolution

  • 논리적 레코드 감지, 논리적 레코드 해결Logical record detection, logical record resolution

행 또는 열 수준 감지, 행 수준 해결Row or Column Level Detection, Row Level Resolution

이 예에서는 다음과 같이 게시가 구성됩니다.In this example, the publication is configured with:

  • column_tracking 을 TRUE 또는 FALSE로 설정column_tracking is TRUE or FALSE

  • logical_record_level_conflict_detection 을 FALSE로 설정logical_record_level_conflict_detection is FALSE

  • logical_record_level_conflict_resolution 을 FALSE로 설정logical_record_level_conflict_resolution is FALSE

    이러한 경우 감지는 행 또는 열 수준에서 수행되고 해결은 행 수준에서 수행됩니다.In this case, detection is at the row or column level and resolution is at the row level. 이렇게 설정하면 논리적 레코드에 대한 모든 변경 내용을 한 단위로 복제할 수 있지만 논리적 레코드 수준에서 충돌을 감지하거나 해결할 수 없습니다.These settings are used to take advantage of having all changes to a logical record replicate as a unit, but without conflict detection or resolution at the logical record level.

열 수준 감지, 논리적 레코드 해결Column Level Detection, Logical Record Resolution

이 예에서는 다음과 같이 게시가 구성됩니다.In this example, the publication is configured with:

  • column_tracking 을 TRUE로 설정column_tracking is TRUE

  • logical_record_level_conflict_detection 을 FALSE로 설정logical_record_level_conflict_detection is FALSE

  • logical_record_level_conflict_resolution 을 TRUE로 설정logical_record_level_conflict_resolution is TRUE

    게시자와 구독자가 동일한 데이터 집합으로 시작하고 orders 테이블과 customers 테이블 사이에 논리적 레코드가 정의되어 있습니다.A Publisher and Subscriber start with the same data set, and a logical record is defined between the orders and customers tables. 게시자는 customers 테이블에서 custcol1 열을 변경하고 orders 테이블에서 ordercol1 열을 변경합니다.The Publisher changes the custcol1 column in the customers table and the ordercol1 in the orders table. 구독자는 customers 테이블의 동일한 행에서 custcol1 열을 변경하고 orders 테이블의 동일한 행에서 ordercol2 열을 변경합니다.The Subscriber changes custcol1 in the same row of the customers table and the ordercol2 column in the same row of the orders table. customer 테이블의 동일한 열을 변경하면 충돌이 발생하지만 orders 테이블을 변경하면 충돌이 발생하지 않습니다.The changes to the same column in the customer table result in a conflict, but the changes to the orders table are not in conflict.

    논리적 레코드 수준에서 충돌이 해결되므로 복제 처리 중 게시자에서 적용되는 변경 내용이 구독자 테이블에서의 변경 내용을 바꿉니다.Because the conflicts are resolved at the logical record level, the winning changes made at the Publisher replace the changes made in the Subscriber tables during replication processing.

    관련 행의 변경 내용을 보여 주는 일련의 테이블Series of tables showing changes to related rows

행 수준 감지, 논리적 레코드 해결Row Level Detection, Logical Record Resolution

이 예에서는 다음과 같이 게시가 구성됩니다.In this example, the publication is configured with:

  • column_tracking 을 FALSE로 설정column_tracking is FALSE

  • logical_record_level_conflict_detection 을 FALSE로 설정logical_record_level_conflict_detection is FALSE

  • logical_record_level_conflict_resolution 을 TRUE로 설정logical_record_level_conflict_resolution is TRUE

    게시자 및 구독자는 동일한 데이터 집합으로 시작됩니다.A Publisher and Subscriber start with the same data set. 게시자는 customers 테이블에서 custcol1 열을 변경합니다.The Publisher changes the custcol1 column in the customers table. 구독자는 customers 테이블에서 custcol2 열을 변경하고 orders 테이블에서 ordercol2 열을 변경합니다.The Subscriber changes custcol2 in the customers table and the ordercol2 column in the orders table. customers 테이블의 동일한 행을 변경하면 충돌이 발생하지만 구독자가 orders 테이블을 변경하는 경우 충돌이 발생하지 않습니다.The changes to the same row in the customers table result in a conflict, but the Subscriber changes to the orders table are not in conflict.

    논리적 레코드 수준에서 충돌이 해결되므로 동기화 중 게시자에서 적용되는 변경 내용이 구독자 테이블에서의 변경 내용을 바꿉니다.Because the conflicts are resolved at the logical record level, during synchronization the winning changes made at the Publisher replace the changes made in the Subscriber tables.

    관련 행의 변경 내용을 보여 주는 일련의 테이블Series of tables showing changes to related rows

논리적 레코드 감지, 논리적 레코드 해결Logical Record Detection, Logical Record Resolution

이 예에서는 다음과 같이 게시가 구성됩니다.In this example, the publication is configured with:

  • logical_record_level_conflict_detection 을 TRUE로 설정logical_record_level_conflict_detection is TRUE

  • logical_record_level_conflict_resolution 을 TRUE로 설정logical_record_level_conflict_resolution is TRUE

    게시자 및 구독자는 동일한 데이터 집합으로 시작됩니다.A Publisher and Subscriber start with the same data set. 게시자는 customers 테이블에서 custcol1 열을 변경합니다.The Publisher changes the custcol1 column in the customers table. 구독자는 orders 테이블에서 ordercol1 열을 변경합니다.The Subscriber changes the ordercol1 column in the orders table. 동일한 행 또는 열이 변경되지 않았지만 custid=1에 대한 동일한 논리적 레코드가 변경되었으므로 논리적 레코드 수준에서 변경 내용이 충돌로 감지됩니다.There are no changes to the same row or columns, but because the changes are made in the same logical record for custid=1, the changes are detected as a conflict at the logical record level.

    또한 논리적 레코드 수준에서 충돌이 해결되므로 동기화 중 게시자에서 적용되는 변경 내용이 구독자 테이블에서의 변경 내용을 바꿉니다.Because the conflicts are also resolved at the logical record level, during synchronization the winning change made at the Publisher replaces the change made in the Subscriber tables.

    관련 행의 변경 내용을 보여 주는 일련의 테이블Series of tables showing changes to related rows

참고 항목See Also

논리적 레코드를 사용하여 관련된 행의 변경 내용 그룹화Group Changes to Related Rows with Logical Records