Транзакции — группы доступности AlwaysOn и зеркальное отображение баз данных

Применимо к:SQL Server

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

Поддержка распределенных транзакций

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

Примечание

SQL Server 2016 (13.x); с пакетом обновления 2 (SP2) и более поздние версии включают полную поддержку распределенных транзакций в группах доступности.

В версиях SQL Server 2016 (13.x); до пакета обновления 2 (SP2) распределенные транзакции между базами данных (т. е. транзакции между базами данных в одном экземпляре SQL Server), включающие базу данных в группе доступности, не поддерживаются.

Сведения о настройка группы доступности для распределенных транзакций см. в статье Configure Availability Group for Distributed Transactions (Настройка группы доступности для распределенных транзакций).

Дополнительные сведения см. в следующих статьях:

SQL Server 2016 с пакетом обновления 1 (SP1) и более ранние версии: поддержка транзакций между базами данных в одном экземпляре SQL Server

В SQL Server 2016 с пакетом обновления 1 (SP1) и более ранних версиях транзакции между базами данных в одном и том же экземпляре SQL Server не поддерживаются в группах доступности. При транзакции между базами данных две базы данных не могут размещаться в одном экземпляре SQL Server, если любая из этих баз данных или обе базы данных находятся в группе доступности. Это ограничение также применяется в том случае, если базы данных принадлежат к одной и той же группе доступности.

Межбазовые транзакции также не поддерживаются для зеркального отображения базы данных.

SQL Server 2016 с пакетом обновления 1 (SP1) и более ранние версии: поддержка распределенных транзакций

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

Координатор распределенных транзакций (Майкрософт) (MSDTC) — это служба Windows, которая предоставляет инфраструктуру транзакций для распределенных систем. Координатор распределенных транзакций (Майкрософт) позволяет клиентским приложениям включать несколько источников данных в одну транзакцию, которая затем фиксируется на всех серверах, включенных в транзакцию. Например, с помощью MSDTC можно координировать транзакции, которые охватывают несколько баз данных на разных серверах.

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

Необходимо выполнить следующие требования.

  • Группы доступности должны быть запущены в Windows Server 2012 R2 или более поздней версии. Для Windows Server 2012 R2 необходимо установить обновление KB3090973, доступное по адресу https://support.microsoft.com/kb/3090973.

  • Availability groups must be created with the CREATE AVAILABILITY GROUP и предложения WITH DTC_SUPPORT = PER_DB . Сейчас невозможно изменить существующую группу доступности.

  • Все экземпляры SQL Server, входящие в группу доступности, должны быть экземплярами SQL Server 2016 или более поздней версии.

Отсутствие поддержки распределенных транзакций

Далее приведены конкретные случаи, когда распределенные транзакции не поддерживаются.

  • В SQL Server 2016 с пакетом обновления 1 (SP1) и более ранней версии, когда несколько баз данных, включенных в транзакцию, находятся в одной группе доступности.

  • В SQL Server 2016 с пакетом обновления 1 (SP1) и более ранней версии, когда по меньшей мере одна база данных находится в группе доступности, а другая база данных находится в том же экземпляре SQL Server.

  • Группа доступности не была создана с включенной распределенной транзакцией.

  • Зеркальное отображение базы данных.

Важно!

Определите соответствующий результат по умолчанию для транзакций, которые DTC не удалось разрешить для вашей среды. Сведения о настройке результата по умолчанию см. в разделе Параметр конфигурации сервера in-doubt xact resolution.

Пример сценария с зеркальным отображением базы данных

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

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

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

Примечание

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

Дальнейшие действия

Группы доступности Always On: взаимодействие (SQL Server)