📅  最后修改于: 2020-11-19 09:26:54             🧑  作者: Mango
WCF中的事务是遵循某些属性的一组操作,这些属性统称为ACID。在此,如果单个操作失败,则整个系统将自动失败。在线下订单时,将进行交易。下面的示例可以帮助您更简单地了解交易过程。
假设您已经从在线商店订购了液晶电视,并且打算用信用卡付款。当您输入下订单的必要信息时,两个操作会同时发生。
首先,指定的金额将从您的银行帐户中扣除,其次,供应商帐户将被记入相同的金额。这两个操作必须成功执行才能拥有成功的事务。
以下是WCF事务的四个属性:
原子-交易完成后,所有操作都必须作为一个不可分割的操作。
一致性-无论是什么操作集,系统始终处于一致性状态,即事务的结果始终符合预期。
隔离-交易完成之前,外部任何实体都看不到系统的中间状态。
耐用性-不管任何类型的故障(硬件,电源中断等),都可以保持承诺状态。
在配置WCF事务时,需要考虑一些因素。这些是绑定和操作行为。
绑定-在WCF中支持事务的绑定只有几个,至关重要的是仅从这些绑定中进行选择,这些绑定在默认情况下保持禁用状态,应启用以获得对事务的必要支持。这些绑定如下-
操作行为-虽然绑定有助于事务传播的路径,但操作要注意事务处理以及操作配置。操作行为主要使用两个属性:TransactionFlow和TransactionScopeRequired。在此,应注意,TransactionFlow主要具有三个值,分别是:允许,强制和未允许。
以下代码显示更改绑定和操作协定的配置是否有助于客户端的传播。
WCF使用三种协议进行交易-
在这三者中,WS-AT是一种可互操作的协议,可实现跨防火墙的分布式事务流。但是,当事务严格基于Microsoft技术时,不应使用此协议。
WCF事务有两个阶段,如下图所示。
准备阶段-在此阶段,事务管理器检查是否所有实体都准备好提交事务。
承诺阶段-在此阶段,实体的承诺实际上开始了。
下图说明了WCF事务的两个阶段的功能。
为了成功启用WCF事务,需要按顺序执行一系列六个步骤。下面讨论了必要的步骤。
步骤1-创建两个WCF服务
在这方面的第一步是在WCF中构建两个服务项目以参与单个事务。数据库事务将在这两种服务上执行,并且应该理解,WCF事务如何将它们统一。还创建了WCFTransactions的Web应用程序,以在单个事务范围内使用两个已创建的服务。
第2步-方法创建及其通过TransactionFlow属性的归属
在这里,将为两个WCF服务创建一个UpdateData方法,以使用OperationContract属性将其插入数据库。为了完成此任务,首先在ServiceContract属性的帮助下创建一个接口类。为了在新创建的方法中启用事务,将其分配给TransactionFlow,并使用is Allowed值允许事务。
[ServiceContract]
public interface IService1 {
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}
步骤3-使用TransactionScopeRequired属性实现WCF服务
通过使用下面显示的代码来完成-
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
try {
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
Boolean doRollback = false;
using(SqlCommand cmd = new SqlCommand(
"insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
try {
cmd.ExecuteNonQuery();
} catch(SqlException) {
doRollback = true;
break;
}
}
if(doRollback)
transaction.Rollback();
else
transaction.Commit();
}
finally {
objConection.Close();
}
}
第4步-通过WCF服务配置文件启用事务流
它的编码如下-
至关重要的一点是,将事务允许的绑定与终结点附加在一起以公开WCF服务。
第5步-在一次交易中同时调用这两种服务
在这里,在一个事务中调用了以上两个服务,为此,TransactionScope对象用于对这两个服务进行分组。调用上述对象的Complete方法以提交WCF事务。要回滚,将调用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 = newServiceReference1.Service1Client();
obj.UpdateData();
ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
obj1.UpdateData();
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
步骤6-测试WCF交易
测试在第6个也是最后一个步骤中完成,在调用第一个WCF服务之后,将强制执行异常。