Принципы работы обновляемых подписок

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

  • Для подписок, обновляемых немедленно, изменения пересылаются непосредственно издателю и применяются с помощью координатора распределенных транзакций (MSDTC) Microsoft.

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

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

Немедленное обновление

Подписки, обновляемые немедленно, используют следующие компоненты:

  • Столбец отслеживания для каждой опубликованной таблицы

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

  • MSDTC

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

  • Триггеры для таблиц в базе данных подписки

    В каждую опубликованную таблицу в базе данных подписки добавляются триггеры вставки, обновления и удаления. Триггеры создаются с использованием модификатора NOT FOR REPLICATION инструкции CREATE TRIGGER, чтобы изменения, применяемые агентом распространителя, не вызывали срабатывания триггера. Дополнительные сведения см. в разделе Управление ограничениями, идентификаторами и триггерами с помощью параметра «NOT FOR REPLICATION».

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

  • Хранимые процедуры

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

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

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

Компоненты немедленного обновления и потоки данных

  1. Изменения, внесенные на подписчике, фиксируются триггером в таблице подписки.

  2. Триггер через MSDTC вызывает соответствующую хранимую процедуру на издателе.

  3. При отсутствии конфликта хранимая процедура выполняет вставку, обновление или удаление. Если имеется конфликт, выполняется откат изменений и на издателе, и на подписчике.

  4. Изменения, внесенные на издателе в результате репликации изменений с подписчика, распространяются на все остальные подписчики согласно расписанию агента распространителя.

Обновление посредством очереди

Подписки, обновляемые посредством очередей, используют следующие компоненты:

  • Столбец отслеживания для каждой опубликованной таблицы

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

  • Триггеры для таблиц в базе данных подписки

    В каждую опубликованную таблицу в базе данных подписки добавляются триггеры вставки, обновления и удаления. Триггеры создаются с использованием модификатора NOT FOR REPLICATION инструкции CREATE TRIGGER, чтобы изменения, применяемые агентом распространителя, не вызывали срабатывания триггера. Дополнительные сведения см. в разделе Управление ограничениями, идентификаторами и триггерами с помощью параметра «NOT FOR REPLICATION».

  • Хранимые процедуры

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

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

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

  • Microsoft Очередь SQL Server

    Каждая база данных подписки содержит системную таблицу MSreplication_queue, в которой хранятся изменения от подписчика.

  • Агент чтения очереди SQL Server

    Агент чтения очереди считывает изменения из MSreplication_queue и применяет их на издателе. Дополнительные сведения см. в разделе Агент чтения очереди репликации.

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

Компоненты очереди обновлений и потоки данных

  1. Обновления, внесенные на подписчике, фиксируются триггерами в таблицах подписки. Триггеры сохраняют эти обновления в MSreplication_queue.

  2. Агент чтения очереди считывает из MSreplication_queue, а затем применяет транзакции из очереди к соответствующей публикации, используя хранимые процедуры репликации.

  3. Во время применения транзакций из очереди осуществляется обнаружение и разрешение конфликтов (если имеются) в соответствии с политикой разрешения конфликтов, установленной при создании публикации. В результате могут быть созданы компенсирующие команды для отката транзакции на подписчике с использованием стандартного процесса распространения репликации транзакций (они отправляются только подписчику, вызвавшему конфликт). Дополнительные сведения см. в разделе Обнаружение и разрешение конфликтов обновлений посредством очередей.

  4. Изменения, внесенные на издателе в результате репликации изменений с подписчика, распространяются на все остальные подписчики согласно расписанию агента распространителя.