TransactionScope и 2-фазная фиксация на двух разных серверах SQL Server - PullRequest
0 голосов
/ 24 сентября 2018

Пожалуйста, рассмотрите этот код из MSDN:

Реализация неявной транзакции с использованием объема транзакции

и этот комментарий:

Для проверкиэтот код, вы можете подключиться к двум различным базам данных на одном сервере, изменив строку подключения, или к другой СУБД третьей стороны, изменив код в кодовом блоке connection2.

, и я был удивлен.Я был удивлен всеми моими знаниями.Из курса Advanced Database я узнал, что:

  1. Запускать команды на двух отдельных СУБД по умолчанию не является транзакцией, если у нас нет менеджера транзакций в каждой СУБД и распределенного менеджера транзакций, который обрабатывает 2-фазныйcommit.

  2. Каждый менеджер транзакций должен иметь возможность ведения журналов для управления транзакциями.

Поэтому у меня есть несколько вопросов:

  1. Имеет ли TransactionScope управление распределенными транзакциями?
  2. Если да, то каков механизм ведения журнала?

Пожалуйста, рассмотрите этот код:

using (TransactionScope scope = new TransactionScope())
{
    using (SqlConnection connection1 = new SqlConnection(connectString1))
    {
         //Do Some work 1
    }

    using (SqlConnection connection2 = new SqlConnection(connectString2))
    {
         //Do Some Work 2
    }
    scope.Complete();
}

и рассмотритеэти шаги:

  • Вставить строку в таблицу в Работе 1 на сервере 1

  • Удалить строку в таблице в Работе 2 на сервере2

  • Выполните команду Complete и она будет успешно выполнена

  • Теперь транзакция должна фиксироваться на двух серверах, но предположим, что это происходит:

На сервер 1 выдается транзакция принятия, которая получаетэто и успешно фиксирует транзакцию.Операция commit отправляется на Сервер 2, и внезапно после этого Сервер 1 становится недоступным.Из-за какой-то сетевой ошибки Сервер 2 не может зафиксировать транзакцию и отправляет исключение в TransactionScope.Теперь сервер 1 находится в правильном состоянии, но он не доступен для отката транзакции.Я хочу знать, как TransactionScope справляется с этой ситуацией?

1 Ответ

0 голосов
/ 24 сентября 2018

1) TransactionScope осуществляет управление распределенными транзакциями?Если да, то каков механизм регистрации?

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

Механизм ведения журнала - это механизм менеджера транзакций каждого источника данных, который вы как бы упомянули:

2) Каждый менеджер транзакций должен иметь возможность ведения журналов для управления транзакциями.

Теперь в вашем сценарии сервер 1 переходит в автономный режим после успешной фиксации транзакции и не может выполнить откат, поскольку сервер 2 не можетне фиксируем ... хорошо, что вероятно позволит серверу 1 все еще восстанавливаться и выполнять откат.Я не знаю специфики, но у каждого менеджера транзакций есть ряд механизмов для правильного отката, и да, журнал здесь вступает в игру.

Рассмотрим эту грубую последовательность шагов, включая двух-Фаза фиксации :

  1. Сервер 1 и Сервер 2 голосуют за фиксацию на фазе 1 (фаза голосования) и информируют DTC и, следовательно, TransactionScope об этих голосах.
  2. Сервер1 перед голосованием записывает, что он будет делать в журнале.
  3. Затем DTC сообщает серверу 1 и 2 о фиксации (фаза фиксации).
  4. Сервер 1 фиксирует, записывает этот факт исообщает DTC.
  5. Сервер 2 не может выполнить фиксацию, поэтому выполняет откат и сообщает DTC.
  6. DTC пытается сообщить серверу 1 об отмене и сообщает TransactionScope.
  7. TransactionScope приходитназад с исключением.

В зависимости от времени, скажем, сервер 1 выпадает где-то после 5, 6 или 7. На этом этапе журналу сервера 1 A) может или B) может не хватитьинформация ктеперь, что делать.

Если сервер 1 все еще работает или перезапускается), он проверяет журнал на наличие проблем, и в случае, если A видит, что ему необходимо выполнить компенсирующую транзакцию .В случае B у него недостаточно информации, поэтому что-то (или кто-то) может решить проблему вне группы.

...