Сложный конфликт при репликации слиянием: разрешение в логической записи

Область применения: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, репликация слиянием обнаруживает конфликты, как и в предыдущих версиях SQL Server, исключительно на основе значения свойства column_tracking для данной статьи. Если значение этого параметра равно TRUE, репликация слиянием игнорирует свойство column_tracking статьи и обнаруживает конфликт, если изменения вносятся в любом месте логической записи. В качестве примера рассмотрен сценарий:

Логическая запись из трех таблиц со значениями

Конфликт обнаруживается, если два пользователя изменяют любые значения логической записи Customer2 в таблицах Customers, Orders, или OrderItems . Этот пример предполагает изменения, внесённые с помощью инструкции UPDATE, но конфликт также может быть обнаружен по изменениям, внесённым с помощью инструкций INSERT или DELETE.

Разрешение конфликтов

По умолчанию при репликации слиянием для разрешения конфликтов используется логика, основанная на приоритетах. Если изменения, приводящие к конфликту, сделаны в базах данных двух подписчиков, предпочтение отдается изменениям подписчика с высшим приоритетом подписки; в случае одинаковых приоритетов побеждает подписчик, чьи изменения достигли издателя раньше. При обнаружении на уровне строк и столбцов вся выигравшая строка всегда полностью перезаписывает проигравшую строку.

Свойство статьи logical_record_level_conflict_resolution может иметь значение TRUE или FALSE. Значение следует задавать только для родительской статьи верхнего уровня, и дочерними статьями оно будет игнорироваться. Если значение равно TRUE, вся выигравшая логическая запись перезаписывает проигравшую логическую запись. При значении параметра FALSE, отдельные выигравшие строки могут быть взяты из различных подписчиков и издателей. Например, подписчик A может выиграть при разрешении конфликта для строки из таблицы Orders, а подписчик B — для связанной строки из таблицы OrderItems. Результатом будет логическая запись, содержащая данные из строки Orders подписчика А и строки 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.

Издатель и подписчик начинают работать с одним и тем же набором данных, логическая запись определяется между таблицами orders и customers . Издатель изменяет столбец custcol1 в таблице customers , а так же ordercol1 в таблице orders . Подписчик изменяет custcol1 в той же самой строке таблицы customers и столбец ordercol2 в той же строке таблицы orders . Изменения одного и того же столбца в таблице customer приводят к конфликту, но изменения таблицы orders к конфликту не приводят.

Поскольку конфликты разрешаются на уровне логических записей, изменения, внесённые на Издателе и признанные победившими, заменяют изменения, внесённые в таблицах Подписчика в процессе репликации.

Первая последовательность таблиц, показывающая изменения связанных строк.

Обнаружение на уровне строк, определение логических записей

В этом примере публикация настраивается с помощью:

  • параметрcolumn_tracking имеет значение FALSE;

  • параметрlogical_record_level_conflict_detection имеет значение FALSE;

  • параметрlogical_record_level_conflict_resolution имеет значение TRUE.

Издатель и подписчик запускаются с одинаковым набором данных. Издатель изменяет столбец custcol1 в таблице пользователи . Подписчик изменяет столбец custcol2 в таблице customers , а так же ordercol2 в таблице orders . Изменения одной и той же строки в таблице customers приводят к конфликту, но изменения подписчиком таблицы orders к конфликту не приводят.

Поскольку конфликты разрешаются на уровне логических записей, во время синхронизации победившие изменения, внесённые на стороне издателя, заменяют изменения, внесённые в таблицы подписчика.

Вторая последовательность таблиц, показывающая изменения связанных строк.

Обнаружение логических записей, сопоставление логических записей

В этом примере публикация настраивается с помощью:

  • параметрlogical_record_level_conflict_detection имеет значение TRUE;

  • параметрlogical_record_level_conflict_resolution имеет значение TRUE.

Издатель и подписчик запускаются с одинаковым набором данных. Издатель изменяет столбец custcol1 в таблице пользователи . Подписчик изменяет столбец ordercol1 в таблице orders . Изменения не относятся к одной и той же строке или одним и тем же столбцам, но поскольку изменения произошли в одной и той же логической записи для custid=1, они распознаны как конфликт на уровне логической записи.

Поскольку разрешение конфликтов производится также на уровне логических записей, во время синхронизации изменения, сделанные в таблицах подписчика, заменяются выигравшими изменениями, сделанными издателем.

Третья последовательность таблиц, показывающая изменения связанных строк.