Страница 15 из 19 Транзакции Транзакционный вызов 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-сериализации. Заключение Описанные в статье механизмы, конечно же, еще рано применять в серьезных проектах, однако вероятность того, что часть из них будет отсутствовать в финальной версии, очень мала. Если вы все-таки планируете долгосрочную перспективу перехода на новые технологии, данный материал, я надеюсь, будет для вас полезным. |