Транзакции — группы доступности AlwaysOn и зеркальное отображение баз данныхTransactions - availability groups and database mirroring

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions)

В этой статье описываются транзакции между базами данных и распределенные транзакции для групп доступности AlwaysOn и зеркального отображения базы данных.This article describes cross-database and distributed transactions support for Always On availability groups and database mirroring.

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

SQL Server 2017 поддерживает распределенные транзакции для баз данных в группах доступности.SQL Server 2017 supports distributed transactions for databases in availability groups. Эта поддержка распространяется на базы данных на одном экземпляре SQL Server или базы данных на разных экземплярах SQL Server.This support includes databases on the same instance of SQL Server or databases on different instances of SQL Server. Распределенные транзакции не поддерживаются для баз данных, настроенных для зеркального отображения.Distributed transactions are not supported for databases configured for database mirroring.

Примечание

SQL Server 2016 (13.x);SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и более поздние версии включают полную поддержку распределенных транзакций в группах доступности.Service Pack 2 and later provides full support for distributed transactions in availability groups.

В версиях SQL Server 2016 (13.x);SQL Server 2016 (13.x) до пакета обновления 2 (SP2) распределенные транзакции между базами данных (т. е. транзакции между базами данных в одном экземпляре SQL Server), включающие базу данных в группе доступности, не поддерживаются.In SQL Server 2016 (13.x);SQL Server 2016 (13.x) versions prior to Service Pack 2, cross-database distributed transactions (i.e. transaction using databases on the same SQL Server instance) involving a database in an availability group are not supported.

Сведения о настройка группы доступности для распределенных транзакций см. в статье Configure Availability Group for Distributed Transactions (Настройка группы доступности для распределенных транзакций).To configure an availability group for distributed transactions, see Configure Availability Group for Distributed Transactions.

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

SQL Server 2016 с пакетом обновления 1 (SP1) и более ранние версии: поддержка транзакций между базами данных в одном экземпляре SQL ServerSQL Server 2016 SP1 and before: Support for cross-database transactions within the same SQL Server instance

В SQL Server 2016 с пакетом обновления 1 (SP1) и более ранних версиях транзакции между базами данных в одном и том же экземпляре SQL Server не поддерживаются в группах доступности.In SQL Server 2016 SP1 and before, cross-database transactions within the same SQL Server instance are not supported for availability groups. При транзакции между базами данных две базы данных не могут размещаться в одном экземпляре SQL Server, если любая из этих баз данных или обе базы данных находятся в группе доступности.No two databases in a cross-database transaction may be hosted by the same SQL Server instance if either or both databases are in an availability group. Это ограничение также применяется в том случае, если базы данных принадлежат к одной и той же группе доступности.This limitation also applies when those databases are part of the same availability group.

Межбазовые транзакции также не поддерживаются для зеркального отображения базы данных.Cross-database transactions are also not supported for database mirroring.

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

Распределенные транзакции в группах доступности поддерживаются в том случае, если базы данных размещаются в разных экземплярах SQL Server.Distributed transactions are supported with availability groups when databases are hosted by different SQL Server instances. Это также справедливо для распределенных транзакций между экземплярами SQL Server и другим сервером, совместимым с DTC.It also applies to distributed transactions between SQL Server instances and other DTC-compliant server.

Координатор распределенных транзакций (Майкрософт) (MSDTC) — это служба Windows, которая предоставляет инфраструктуру транзакций для распределенных систем.Microsoft Distributed Transaction Coordinator (MSDTC or DTC) is a Windows service that provides transaction infrastructure for distributed systems. Координатор распределенных транзакций (Майкрософт) позволяет клиентским приложениям включать несколько источников данных в одну транзакцию, которая затем фиксируется на всех серверах, включенных в транзакцию.MSDTC permits client applications to include multiple data sources in one transaction, which then is committed across all servers included in the transaction. Например, с помощью MSDTC можно координировать транзакции, которые охватывают несколько баз данных на разных серверах.For example, you can use MSDTC to coordinate transactions that span multiple databases on different servers.

В SQL Server 2016 представлена возможность использования распределенных транзакций, где одна или несколько баз данных входят в группу доступности.SQL Server 2016 introduces the capability to use distributed transactions where one or more of the databases in the transaction are in an availability group. До выпуска SQL Server 2016 распределенные транзакции не поддерживались для баз данных в группах доступности.Prior to SQL Server 2016 distributed transactions were not supported for databases in availability groups. SQL Server 2016 может регистрировать диспетчер ресурсов для каждой базы данных.SQL Server 2016 can register a resource manager per database. Эта новая функция определяет возможность включения баз данных в группах доступности в распределенные транзакции.This new capability is why distributed transactions can include databases in availability groups.

Необходимо выполнить следующие требования.The following requirements must be met:

  • Группы доступности должны быть запущены в Windows Server 2012 R2 или более поздней версии.Availability groups must be running on Windows Server 2012 R2 or later. Для Windows Server 2012 R2 необходимо установить обновление KB3090973, доступное по адресу https://support.microsoft.com/kb/3090973.For Windows Server 2012 R2, you must install the update in KB3090973 available at https://support.microsoft.com/kb/3090973.

  • Группы доступности необходимо создать с помощью команды CREATE AVAILABILITY GROUP и предложения WITH DTC_SUPPORT = PER_DB.Availability groups must be created with the CREATE AVAILABILITY GROUP command and the WITH DTC_SUPPORT = PER_DB clause. Сейчас невозможно изменить существующую группу доступности.You cannot currently alter an existing availability group.

  • Все экземпляры SQL Server, входящие в группу доступности, должны быть экземплярами SQL Server 2016 или более поздней версии.All instances of SQL Server that participate in the availability group must be SQL Server 2016 or later.

Отсутствие поддержки распределенных транзакцийNon-support for distributed transactions

Далее приведены конкретные случаи, когда распределенные транзакции не поддерживаются.Specific cases where distributed transactions are not supported include:

  • В SQL Server 2016 с пакетом обновления 1 (SP1) и более ранней версии, когда несколько баз данных, включенных в транзакцию, находятся в одной группе доступности.In SQL Server 2016 SP1 and prior, where more than one database involved in the transaction is in the same availability group.

  • В SQL Server 2016 с пакетом обновления 1 (SP1) и более ранней версии, когда по меньшей мере одна база данных находится в группе доступности, а другая база данных находится в том же экземпляре SQL Server.In SQL Server 2016 SP1 and prior, where at least one database is in an availability group and another database is on the same instance of SQL Server.

  • Группа доступности не была создана с включенной распределенной транзакцией.Where the availability group was not created with enable distributed transaction.

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

Важно!

Определите соответствующий результат по умолчанию для транзакций, которые DTC не удалось разрешить для вашей среды.Determine the appropriate default outcome of transactions that DTC is unable to resolve for your environment. Сведения о настройке результата по умолчанию см. в разделе Параметр конфигурации сервера in-doubt xact resolution.For information on how to configure the default outcome see in-doubt xact resolution Server Configuration Option.

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

В следующем примере зеркального отображения базы данных показано, как возникает логическое несоответствие.The following database mirroring example illustrates how a logical inconsistency could occur. В этом примере приложение использует межбазовую транзакцию для вставки двух строк данных: одна строка вставляется в таблицу зеркально отображаемой базы данных A, другая — в таблицу второй базы данных, B. База данных A зеркально отображается в режиме высокого уровня безопасности с автоматической отработкой отказа.In this example, an application uses a cross-database transaction to insert two rows of data: one row is inserted into a table in a mirrored database, A, and the other row is inserted into a table in another database, B. Database A is being mirrored in high-safety mode with automatic failover. При фиксации транзакции база данных A становится недоступной, и сеанс зеркального отображения автоматически переходит на зеркальное отображение базы данных A.While the transaction is being committed, database A becomes unavailable, and the mirroring session automatically fails over to the mirror of database A.

После автоматической отработки отказа межбазовая транзакция может успешно зафиксироваться в базе данных B, но не в базе данных, с которой выполнен автоматический переход.After the failover, the cross-database transaction might be successfully committed on database B but not on the failed-over database. Это произойдет, например, в том случае, если исходный основной сервер для базы данных А не отправил журнал межбазовых транзакций на зеркальный сервер перед возникновением сбоя.For example, if the original principal server for database A had not sent the log for the cross-database transaction to the mirror server before the failure. После автоматической отработки отказа эта транзакция не будет существовать на новом основном сервере.After the failover, that transaction would not exist on the new principal server. Базы данных A и B станут несогласованными, поскольку вставленные данные в базе данных B останутся нетронутыми, в то время как вставленные данные в базе данных A будут потеряны.Databases A and B would become inconsistent, because the data inserted in database B remains intact, but the data inserted in database A has been lost.

Похожий сценарий может возникнуть при использовании транзакций координатора распределенных транзакций (Майкрософт).A similar scenario can occur while using an MS DTC transaction. Например, после автоматической отработки отказа новая основная база данных обращается к MS DTC.For example, after failover, the new principal contacts MS DTC. Но MS DTC не знает о новом основном сервере и завершает все транзакции, готовящиеся к фиксации, которые считаются зафиксированными в других базах данных.But MS DTC has no knowledge of the new principal server, and it terminates any transactions that are "preparing to commit," which are considered committed in other databases.

Примечание

Использование зеркального отображения базы данных или групп доступности с координатором распределенных транзакций возможно только с применением способов, описанных в этой статье.Using Database Mirroring with DTC or using availability groups with DTC in ways not approved in this article is not supported. Это не означает, что компоненты продукта, не связанные с координатором распределенных транзакций, также не поддерживаются. Однако проблемы, связанные с ненадлежащим использованием распределенных транзакций, не будут устранены.This does not imply that aspects of the product unrelated to DTC are unsupported; however, any issues arising from the improper use of distributed transactions are not supported.

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

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