目录
简介和目标
第1步:创建两个WCF服务小号
第 2 步:使用TransactionFlow的属性接口方法
第 3 步:使用TransactionScopeRequired对实现进行属性
步骤 4:使用WCF服务配置文件启用事务流
第 5 步:在一个事务中调用2个服务
第6步:测试您的事务是否正常工作
- 下载源代码 - 66.01 KB
在本文中,我们将尝试了解如何在WCF服务中实现事务。因此,我们将创建两个WCF服务来执行数据库事务,然后将它们合并为一个事务。我们将首先了解在WCF服务中启用事务的6个重要步骤。文章最后我们会尝试强制出错,看看出错后事务是如何回滚的。
第1步:创建两个WCF服务小号第一步是创建两个将参与一个事务的WCF服务项目。在这两个WCF服务中,我们将进行数据库事务,并尝试了解WCF事务如何统一它们。我们还创建了一个具有名称的Web应用程序WCFTransactions,它将在一个事务范围内使用这两个服务。
第 2 步:使用TransactionFlow的属性接口方法在这两个WCF服务中,我们将创建一个调用UpdateData的方法,该方法 将插入到数据库中。所以,第一件事就是使用ServiceContract属性创建一个接口类和使用OperationContract属性创建一个方法UpdateData。为了在UpdateData方法中启用事务,我们需要使用TransactionFlow属性它,并且我们使用TransactionFlowOption.Allowed enum指定允许该方法使用事务。
[ServiceContract]
public interface IService1
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}
第三步是使用TransactionScopeRequired作为true来属性WCF服务的实现。下面是代码片段,它具有简单的数据库插入功能,即按TransactionScopeRequired属性进行属性的UpdateData。
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData()
{
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
SqlCommand objCommand = new SqlCommand("insert into Customer
(CustomerName,CustomerCode) values('sss','sss')",objConnection);
objCommand.ExecuteNonQuery();
objConnection.Close();
}
我们还需要通过将transactionFlow属性设置为true来为wsHttpBinding启用事务。
我们需要将启用事务的绑定附加到暴露WCF服务的端点。
现在我们已经完成了服务器端事务的启用,是时候在1个事务中调用上述2个服务了。我们需要使用该TransactionScope对象将上述2个WCF服务分组到一个事务中。要提交所有WCF事务,我们调用Transactionscope对象的Complete方法。要回滚,我们需要调用该Dispose方法。
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
// Call your webservice transactions here
ts.Complete();
}
catch (Exception ex)
{
ts.Dispose();
}
}
下面是完整的代码片段,其中我们将两个WCF事务分组在一个作用域内,如下所示:
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
obj.UpdateData();
ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
obj1.UpdateData();
ts.Complete();
}
catch (Exception ex)
{
ts.Dispose();
}
}
是时候测试交易是否真的有效了。我们正在调用两个服务,它们都在执行插入操作。在第一次WCF服务调用之后,我们强制发生异常。换句话说,第一个WCF服务的数据插入应该恢复。如果您检查数据库记录,您将看到WCF服务没有插入任何记录。
6 Steps to Enable Transactions in WCF - CodeProject