Транзакции между базами данных не поддерживаются при зеркальном отображении баз данных или в группах доступности AlwaysOn (SQL Server)

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

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

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

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

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

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