启用 WCF 事务的 6 个步骤






4.74/5 (46投票s)
启用 WCF 事务的 6 个步骤。
目录
- 引言和目标
- 步骤 1:创建两个 WCF 服务
- 步骤 2:使用 TransactionFlow 属性修饰接口方法
- 步骤 3:使用 TransactionScopeRequired 属性修饰实现
- 步骤 4:使用 WCF 服务配置文件启用事务流
- 步骤 5:在一个事务中调用 2 个服务
- 步骤 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 服务插入的任何记录。
历史
- 2009 年 8 月 6 日:首次发布
- 我可以更新这篇文章吗?它不是我的!
如需进一步阅读,请观看以下面试准备视频和分步视频系列。