Обнаружение конфликтов в одноранговой репликации

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

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

ПримечаниеПримечание

Чтобы избежать возможной несогласованности данных, убедитесь, что в одноранговой топологии отсутствуют конфликты, даже при включенном обнаружении конфликтов. Чтобы операции записи выполнялись только на одном узле, приложения, получающие доступ к данным и изменяющие их, должны секционировать операции вставки, обновления и удаления. Такое секционирование обеспечивает тот факт, что изменения конкретной строки на одном узле синхронизируются с остальными узлами в топологии, прежде чем эта строка будет изменена другим узлом. Если приложению требуется усложненное обнаружение конфликтов, используйте репликацию слиянием. Дополнительные сведения см. в разделах Репликация слиянием и Обнаружение и разрешение конфликтов репликации слиянием.

Основные сведения о конфликтах и обнаружении конфликтов

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

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

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

По умолчанию при возникновении этой ошибки агент распространителя прекращает применение изменений к данному узлу. Сведения об обработке выявленных конфликтов см. ниже в разделе «Обработка конфликтов».

ПримечаниеПримечание

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

При выполнении одноранговой репликации обнаруживаются следующие типы конфликтов.

  • Вставка-вставка

    Все строки во всех таблицах, участвующих в одноранговой репликации, уникальным образом идентифицируются с помощью значений первичного ключа. Конфликт «вставка-вставка» имеет место тогда, когда вставка строки с одним и тем же значением ключа осуществляется более чем на одном узле.

  • Обновление-обновление

    Происходит, когда одна и та же строка обновляется более чем на одном узле.

  • Вставка-обновление

    Происходит, когда строка обновляется на одном узле, а на другом та же строка удаляется и затем вновь вставляется.

  • Вставка-удаление

    Происходит, если строка удаляется на одном узле, а на другом та же строка удаляется и затем вновь вставляется.

  • Обновление-удаление

    Происходит, когда строка обновляется на одном узле, а на другом та же строка удаляется.

  • Удаление-удаление

    Происходит, когда строка удаляется более чем на одном узле.

Активизация функции обнаружения конфликтов

Для использования обнаружения конфликтов на всех узлах должен выполняться SQL Server 2008 или более поздняя версия; кроме того, обнаружение должно быть включено на всех узлах. В SQL Server 2008 и более поздних версиях обнаружение конфликтов в среде Среда SQL Server Management Studio включено. Мы рекомендуем включать функцию обнаружения конфликтов — даже в тех случаях, когда возникновение конфликтов не ожидается. Средства обнаружения конфликтов могут быть включены и отключены с помощью среды Среда Management Studio или хранимых процедур на языке Transact-SQL.

  • Включение и отключение средств обнаружения в Среда Management Studio осуществляется либо на странице Параметры подписки диалогового окна Свойства публикации, либо на странице Настройка топологии мастера настройки одноранговой топологии. Дополнительные сведения см. в разделе Обнаружение конфликтов в одноранговой репликации.

    Если настройка режима обнаружения конфликтов осуществляется с помощью среды Среда Management Studio, агент распределителя прекращает применение изменений при обнаружении конфликта.

  • Кроме того, режим обнаружения можно включать и отключать с помощью следующих хранимых процедур: sp_addpublication или sp_configure_peerconflictdetection. Дополнительные сведения см. в разделе Обнаружение конфликтов в одноранговой репликации.

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

Обработка конфликтов

Когда в ходе одноранговой репликации имеет место конфликт, формируется предупреждение Peer-to-peer conflict detection alert. Рекомендуется настраивать это предупреждение таким образом, чтобы оповещение происходило при возникновении конфликта. Дополнительные сведения о предупреждениях см. в разделе Используйте предупреждения для событий агента репликации.

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

  • Выполните повторную инициализацию узла, на котором был обнаружен конфликт, с резервной копии узла, содержащей необходимые данные (рекомендуемый подход). Этот метод гарантирует сохранение данных в согласованном состоянии.

  • Попытайтесь вновь синхронизировать узел, дав возможность агенту распространителя продолжить применение изменений.

    1. Выполните хранимую процедуру sp_changepublication: укажите значение 'p2p_continue_onconflict' для параметра @property и значение true для параметра @value.

    2. Перезапустите агент распространителя.

    3. Проверьте обнаруженные конфликты с помощью средства просмотра конфликтов и определите вовлеченные в конфликты строки, тип конфликта, а также выигравшую сторону. Конфликт разрешается в соответствии со значением идентификатора инициатора, указанным пользователем во время настройки. Победителем в конфликте становится строка, инициированная на узле с самым высоким значением идентификатора. Дополнительные сведения см. в разделе просмотреть конфликты данных для публикаций транзакций (среда SQL Server Management Studio).

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

      ПримечаниеПримечание

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

    5. Выполните хранимую процедуру sp_changepublication: укажите значение 'p2p_continue_onconflict' для параметра @property и значение false для параметра @value.

См. также

Основные понятия

Одноранговая репликация транзакций