Распределенные транзакции

Tsql теория > Распределенные транзакции
26.02.2013 10:58:03



Статья:

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

 

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

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

1. Каждый из серверов отправляет сообщение о готовности к подтверждению.

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

3. Каждый из серверов сообщает об окончании подготовки к подтверждению.

4. Только после того как все серверы ответили положительно о готовности к подтверждению, сообщение о реальном подтверждении транзакции отправляется всем им.

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

Координатор распределенных транзакций является отдельной службой SQL Server, которая запускается и останавливается с помощью SQL Server Service Manager.

Только один экземпляр этой службы запускается на одном сервере, независимо от количества установленных и запущенных на нем экземпляров SQL Server. Фактическое имя службы — msdtc . ехе, потребляемый объем памяти — 2,5 Мбайт.

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

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

Распределенные транзакции аналогичны локальным, но имеют некоторые расширения в синтаксисе:

SET xact_abort on;

BEGIN DISTRIBUTED TRANSACTION;

В случае ошибки параметр подключения xact_abort приведет к откату текущей транзакции, а не только текущей инструкции Т-SQL. Параметр xact_abort необходим, чтобы любая распределенная транзакция могла подключиться к удаленному экземпляру SQL Server, равно как и к большинству других соединений OLE DB.

Инструкция BEGIN DISTRIBUTED TRANSACTION, которая определяет, доступна ли служба DTC, строго не требуется. Даже если транзакция начинается инструкцией BEGIN TRAN, она все равно будет расширена до распределенной, и наличие службы DTC будет проверено, как только будет выполнен первый распределенный запрос. В то же время считается хорошей практикой использовать полную форму BEGIN DISTRIBUTED TRANSACTION, чтобы наличие DTC проверялось в самом начале транзакции. Если служба DTC не запущена, то автоматически выдается сообщение об ошибке:

Server: Msg 8501, Level 16, State 3, Line 7 MSDTC on server 'XPS' is unavailable.

Следующий пример демонстрирует распределенную транзакцию между локальным сервером и его вторым экземпляром:

USE Family;

SET xact_abort on;

UPDATE Person

SET LastName = 'Johnson2' WHERE PersonID = 10;

UPDATE [Noli\SQL2].Family.dbo.Person SET LastName = 'Johnson2'

WHERE PersonID = 10;

COMMIT TRANSACTION;

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

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

Работу координатора распределенных транзакций можно просмотреть в самой операционной системе в качестве отдельно устанавливаемой службы сервера Windows Server 2003. Для этого нужно в главном системном меню Start выбрать пункт Control Panel^Administrative Tools^Component Services. Служба компонентов отображает список текущих ожидающих распределенных транзакций (рис. 15.8), а также статистику службы DTC