Published on

April 25, 2008

Понимание транзакций в репликации SQL Server

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

Репликация простых транзакций

Начнем с простого случая. Предположим, у нас есть транзакция, которая добавляет 4 записи на издателе:

set xact_abort on
begin tran
insert 1
insert 2
insert 3
insert 4
commit tran

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

Сбой транзакций на издателе

Что происходит, если транзакция не выполняется на издателе? Предположим, мы выполняем ту же транзакцию, что и выше, но “Command4” не выполняется. В этом случае транзакция откатывается на издателе и ни одна строка не добавляется. В результате ни одна из этих команд не реплицируется на подписчике. В транзакционной репликации реплицируются только подтвержденные транзакции.

Сбой транзакций на подписчике

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

Большие транзакции и проблемы с таймаутом

Еще одна проблема в транзакционной репликации – работа с большими транзакциями. Если оператор обновления затрагивает большое количество строк, это может вызвать проблемы с таймаутом для агента чтения журнала. Это может привести к ошибкам, таким как “Истекло время ожидания” или “Во время ожидания ресурсов памяти произошел таймаут выполнения запроса”.

Для решения этих проблем с таймаутом можно изменить несколько параметров профиля:

  • QueryTimeout: Увеличение таймаута запроса может помочь решить проблемы с таймаутом, вызванные большими транзакциями.
  • MaxCmdsInTran: Этот параметр позволяет разделить большую транзакцию на несколько меньших транзакций. Однако будьте осторожны, так как это может нарушить свойства ACID исходной транзакции, если команда внутри транзакции не выполняется.
  • ReadBatchSize: Этот параметр определяет количество транзакций, считываемых агентом чтения журнала в каждом цикле обработки. Установка его в меньшее значение может помочь очистить отставку от небольших транзакций и предотвратить проблемы с таймаутом.
  • ReadBatchThreshold: Подобно параметру ReadBatchSize, этот параметр относится к количеству команд репликации, которые должны быть считаны из журнала транзакций в пакете обработки. Изменение его вместе с QueryTimeout может помочь устранить отставку, вызванную большими транзакциями.

Таймауты или замедление агента распределения

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

  • CommitBatchSize: Этот параметр определяет количество транзакций, передаваемых подписчику, прежде чем будет выполнено оператор COMMIT. Он может использоваться для настройки пропускной способности агента распределения.
  • CommitBatchThreshold: Этот параметр относится к количеству команд репликации, передаваемых подписчику, прежде чем будет выполнено оператор COMMIT. Как и CommitBatchSize, он может использоваться для оптимизации пропускной способности агента распределения.

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

Заключение

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

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

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.