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