XML Web-службы в Microsoft SQL Server 2005
Страница 15. Транзакции


 

Транзакции

Транзакционный вызов Web-методов — это очень мощная возможность, позволяющая избавиться от многих проблем при реализации бизнес-логики. Реализация транзакций в Yukon для конечных точек SOAP имеет некоторые ограничения.

  • Транзакции работают в контексте сессий.
  • Транзакции работают только с пакетными запросами (т.е. как таковые вызовы Web-методов нельзя обрамлять в транзакции).

Для начала транзакции необходимо инициировать сессию, передать заголовок environmentChangeNotifications и собственно начать транзакцию (простую или распределенную) в коде TSQL пакетного запроса.

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

<sqlresultstream:SqlTransaction xsi:type=»sqltransaction:SqlTransaction»>
<sqltransaction:Descriptor> AQAAADkAAAA=</sqltransaction:Descriptor>
<sqltransaction:Type>Begin</sqltransaction:Type>
</sqlresultstream:SqlTransaction>

где sqltransaction — префикс пространства имен https://schemas. microsoft.com/sqlserver/ 2004/SOAP/types/SqlTransaction, значение текстового узла элемента Descriptor — идентификатор транзакции и тип уведомления о транзакции — Begin.

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

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

<sqloptions:sqlSession sessionId=»jGqn3/X73EGHjFxZ12zovw== »transactionDescriptor=»AQAAADMAAAA=»/>

Завершить транзакцию можно двумя способами: либо подтвердить (commit) ее, либо отменить (rollback). В обоих случаях сервер должен прислать ответное сообщение с элементом SqlTransaction, который бы содержал дескриптор транзакции и соответствующий тип: при отмене транзакции — rollback, при подтверждении — commit. Кроме этого, транзакция может быть отменена при закрытии сессии.

Транзакции (как и сессии и другие заголовки) необходимо задавать самостоятельно. В BOL есть примеры подобных заголовков с использованием XML-сериализации.

Заключение

Описанные в статье механизмы, конечно же, еще рано применять в серьезных проектах, однако вероятность того, что часть из них будет отсутствовать в финальной версии, очень мала. Если вы все-таки планируете долгосрочную перспективу перехода на новые технологии, данный материал, я надеюсь, будет для вас полезным.

 
« Предыдущая статья   Следующая статья »