Поддержка транзакций для веб-служб XML использует поддержку общеязыковой среды выполнения, которая основана на той же модели распределенных транзакций, что и в Microsoft Transaction Server (MTS) и службах COM+. Эта модель основана на явном определении того, участвует ли объект в транзакции, а не на написании специального кода для обработки делегирования и обратных вызовов для транзакции. Для веб-службы XML, созданной с использованием ASP.NET, вы можете объявить поведение транзакции веб-службы XML, задав атрибут TransactionOption атрибута WebMethod, который применяется к методу веб-службы XML. Если при выполнении метода веб-службы XML выдается исключение, транзакция завершается автоматически; наоборот, если исключения не возникает, транзакция автоматически делегируется;
Атрибут TransactionOption атрибута WebMethod определяет, как метод веб-службы XML участвует в транзакции. Хотя этот уровень объявления представляет собой логику транзакции, он находится на шаг дальше от фактической транзакции. Фактическая транзакция происходит, когда объект транзакции обращается к источнику данных (например, к базе данных или очереди сообщений). Транзакции, связанные с этим объектом, автоматически передаются соответствующему менеджеру ресурсов. Поставщик данных .NET Framework, такой как поставщик данных .NET Framework (для SQL Server или OLE DB), ищет транзакции в контексте объекта и каталогизирует их через координатора распределенных транзакций (DTC, координатор распределенных транзакций). Все транзакции генерируются автоматически.
Методы веб-службы XML могут участвовать только в транзакции, которая является корнем новой транзакции. В качестве корня новой транзакции все взаимодействия с менеджерами ресурсов (такими как серверы с Microsoft SQL Server, Microsoft Message Queuing и Microsoft Host Integration Server) поддерживают свойства ACID, необходимые для запуска надежных распределенных приложений. Методы веб-службы XML, вызывающие другие методы веб-службы XML, участвуют в различных транзакциях, поскольку транзакции не проходят через методы веб-службы XML.
Объявите веб-службу XML, используя транзакции из методов веб-службы XML
.
[С#]
<%@ WebService Language="C#" Class="Orders" %>
[Визуальный базовый]
<%@ WebService Language="VB" Class="Orders" %>
Добавьте инструкцию ассемблера в System.EnterpriseServices.
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
Добавьте ссылки на пространства доменных имен System.Web.Services и System.EnterpriseServices.
[С#]
использование System.Web.Services;
использование System.EnterpriseServices;
[Визуальный базовый]
Импортирует System.Web.Services
Импортирует System.EnterpriseServices
объявляет метод веб-службы XML и устанавливает для свойства TransactionOption атрибута WebMethod значение TransactionOption.RequiresNew.
[С#]
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor (строка LastName)
[Визуальный базовый]
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Открытая функция DeleteAuthor(lastName As String) Как целое число
В следующем примере кода показана веб-служба XML, использующая один метод веб-службы XML, вызывающий DeleteDatabase. Этот метод веб-службы XML выполняет операцию с базой данных в рамках транзакции. Если операция базы данных выдает исключение, транзакция автоматически останавливается, в противном случае транзакция автоматически фиксируется;
[С#]
<%@ WebService Language="C#" Class="Orders" %>
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
использование системы;
использование System.Data;
использование System.Data.SqlClient;
использование System.Web.Services;
использование
общедоступного класса Orders: WebService;
{
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor (строка LastName)
{
String deleteCmd = "УДАЛЕНИЕ ОТ авторов WHERE au_lname='" +
фамилия + "'";
Строковое исключениеCausingCmdSQL = «УДАЛЕНИЕ ИЗ NonExistingTable WHERE
au_lname='" + LastName + "'" ;
SqlConnection sqlConn = new SqlConnection(
"Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver");
SqlCommand deleteCmd = new SqlCommand(deleteCmdSQL,sqlConn);
Исключение SqlCommandCausingCmd = новое
SqlCommand(ExceptionCausingCmdSQL,sqlConn);
// Эта команда должна выполняться правильно.
deleteCmd.Connection.Open();
deleteCmd.ExecuteNonQuery();
// Эта команда приводит к исключению, поэтому первая команда
// автоматически откатывается, поскольку метод веб-службы XML.
// участвуем в транзакции и возникает исключение, ASP.NET
// автоматически прерывает транзакцию.
// выполнено правильно, откатывается.
int cmdResult =ExceptionCausingCmd.ExecuteNonQuery()
;
return cmdResult;
}
}
[Визуальный базовый]
<%@ WebService Language="VB" Class="Orders" %>
<%@assembly name="System.EnterpriseServices" %>
Импортирует систему
ИмпортСистем.Данные
Импортирует System.Data.SqlClient.
Импортирует System.Web.Services
Импортирует System.Web.Util.
Импортирует
заказы общедоступного класса
System.EnterpriseServices<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Открытая функция DeleteAuthor (lastName как строка) как целое число
Dim deleteCmdSQL As String = «УДАЛЕНИЕ ОТ авторов WHERE au_lname='» + _
фамилия + "'"
Тусклое исключениеCausingCmdSQL As String = "DELETE FROM" + _
"NonExistingTable WHERE au_lname='" + LastName + "'"
Dim sqlConn As SqlConnection = New SqlConnection( _
«Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver»)
Dim deleteCmd As SqlCommand = New SqlCommand(deleteCmdSQL,sqlConn)
Тусклое исключениеCausingCmd As SqlCommand = New _
SqlCommand(ExceptionCausingCmdSQL,sqlConn)
'Эта команда должна выполняться правильно.
deleteCmd.Connection.Open()
deleteCmd.ExecuteNonQuery()
'Эта команда приводит к исключению, поэтому первая команда
' автоматически откатывается, поскольку метод веб-службы XML.
'участвуем в транзакции и возникает исключение, ASP.NET
' автоматически прерывает транзакцию.
' выполнено правильно, откатывается.
Dim cmdResult As Integer =ExceptionCausingCmd.ExecuteNonQuery().
sqlConn.Close()
Возвращает cmdResult
Конечная функция
Конечный класс