Поделиться через


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

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

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

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

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

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

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

Важно!

Использование зеркального отображения базы данных или групп доступности вместе с DTC не приводит к неподдерживаемой установке SQL Server. Однако, если база данных является частью сеанса зеркального отображения базы данных или группы доступности и в базе данных также используется DTC, проблемы поддержки будут исследованы Microsoft только в случае, если они не имеют отношения к совместному использованию зеркального отображения базы данных или групп доступности вместе с DTC.