65.9K
CodeProject 正在变化。 阅读更多。
Home

启用 WCF 事务的 6 个步骤

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (46投票s)

2009 年 8 月 6 日

CPOL

3分钟阅读

viewsIcon

287872

downloadIcon

5724

启用 WCF 事务的 6 个步骤。

目录

引言和目标

在本文中,我们将尝试了解如何在 WCF 服务中实现事务。因此,我们将创建两个执行数据库事务的 WCF 服务,然后将它们合并到一个事务中。我们将首先了解在 WCF 服务中启用事务的 6 个重要步骤。在文章的最后,我们将尝试强制产生一个错误,并查看事务如何在错误发生后回滚。

步骤 1:创建两个 WCF 服务

第一步是创建两个将参与一个事务的 WCF 服务项目。在这两个 WCF 服务中,我们将执行数据库事务,并且我们将尝试了解 WCF 事务如何统一它们。我们还创建了一个名为 WCFTransactions 的 Web 应用程序,它将在一个事务范围中消耗这两个服务。

步骤 2:使用 TransactionFlow 属性修饰接口方法

在这两个 WCF 服务中,我们将创建一个名为 UpdateData 的方法,该方法将插入到数据库中。因此,首先是创建具有 ServiceContract 属性的接口类和具有 OperationContract 属性的 UpdateData 方法。为了在 UpdateData 方法中启用事务,我们需要使用 TransactionFlow 属性修饰它,并且我们已指定允许使用 TransactionFlowOption.Allowed enum 为此方法启用事务。

[ServiceContract]
public interface IService1
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}

步骤 3:使用 TransactionScopeRequired 属性修饰实现

第三rd步是用 TransactionScopeRequired 属性将 WCF 服务的实现标记为 true。以下是代码片段,它具有一个简单的数据库插入函数,即 UpdateData,它由 TransactionScopeRequired 属性修饰。

[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();
}

步骤 4:使用 WCF 服务配置文件启用事务流

我们还需要通过将 transactionFlow 属性设置为 true 来为 wsHttpBinding 启用事务。

<bindings>
<wsHttpBinding>
<binding name="TransactionalBind" transactionFlow="true"/>
</wsHttpBinding>
</bindings>

我们需要将事务启用的绑定附加到公开我们的 WCF 服务的终结点。

<endpoint address="" binding="wsHttpBinding" 
	bindingConfiguration="TransactionalBind" contract="WcfService1.IService1">

步骤 5:在一个事务中调用 2 个服务

现在我们完成了启用服务器端事务,是时候在一个事务中调用上述 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();
}
}

步骤 6:测试您的事务是否有效

现在是测试事务是否真正有效的时候了。我们正在调用两个服务,这两个服务都在执行插入操作。在第一个 WCF 服务调用之后,我们强制产生一个异常。换句话说,第一个 WCF 服务的数据插入应该恢复。如果检查数据库记录,您将看不到 WCF 服务插入的任何记录。

Click to enlarge

历史

  • 2009 年 8 月 6 日:首次发布
  • 我可以更新这篇文章吗?它不是我的!

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

在 WCF 中启用事务的 6 个步骤 - CodeProject - 代码之家
© . All rights reserved.