WCF学习笔记之事务编程

一:WCF事务设置

事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元;

WCF通过System.ServiceModel.TransactionFlowAttribute特性定义在契约的相应操作方法上;

TransctionFlowOption三个选项:NotAllowed、Allowed、Mandatory不同的事务流转策略;

1:NotAllowed(默认) 客户端的事务不会允许被流转到服务端,服务端也不会试图去接收流入的事务;

2:Allowed 如果客户端的事务在,则被流转到服务端,服务端会试图去接收流入的事务;

3:Mandatory 客户端必须在一个事务中进行服务调用,相应的事务会被流转到服务端。服务端接收到的消息  中必须包含被序列化的事务;

    [ServiceContract]
public interface IBankingService
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void Transfer(string fromAccountId, string toAccountId, double amount);
}

由于分布式事务在客户端和服务端之间协调过程依赖于它们之间的相互消息交换,因此在一个单向(One-Way)

操作契约上不允许将应用在上面的TransctionFlowAttribute特性指定为:Allowed 或 Mandatory [P143]

二:事务与绑定的联系

支持事务绑定的除BasicHttpBinding(基于WS-I Basic Profile标准绑定)、NetMsmqBinding(只能采用单工的消息交换)、

MsmqIntegrationBinding(只能采用单工的消息交换) 其它都有事务的流转能力;

支持事务的绑定流转默认也是被关闭,要通过配置或者编程的方式开启该选项;

WCF支持三种不同的事务处理协议:OleTx、WS-AT 1.0、WS-AT 1.1 分别对应于TransactionProtocol中的三个静态只读

属性OleTransactions(与Default默认一样)、WSAtomicTransationOctober2004、WSAtomicTransaction11

NetTcpBinding和NetNamedPipeBinding通过TransactionFlow设置支持事务的开关,TransactionProtocol设置事务协议;

WSHttpBinding、WSDualHttpBinding和WSFedrationHttpBinding支持协议WS-AT 1.0,而WS2007HttpBinding和

WS2007FederationHttpBinding支持协议WS-AT 1.1,它们仅仅只有TransactionFlow 没有TransactionProtocol设置事务协议;

<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="transactionalTcpBinding" transactionFlow="true"
transactionProtocol="WSAtomicTransactionOctober2004">
</binding>
</netTcpBinding> <ws2007HttpBinding>
<binding name="transactionalHttpBinding" transactionFlow="true"></binding>
</ws2007HttpBinding>
</bindings>
<services>
<service name="Service.WithdrawService">
<endpoint binding="customBinding"
bindingConfiguration="transactionalTcpBinding"
contract="Service.Interface.IWithdrawService" />
</service>
<service name="Service.DepositService">
<endpoint binding="customBinding"
bindingConfiguration="transactionalHttpBinding"
contract="Service.Interface.IDepositService" />
</service>
</services>
</system.serviceModel>
</configuration>

三:通过服务(操作)行为控制事务

通过服务契约确定事务流转的策略,通过事务绑定实施事务的流转;通过服务操作设置提交方式及是否自动登记到事务之中

服务操作OperationBehaviorAttribute两个事务管理相关的属性:TransactionAutoComplete 和 TransactionScopeRequired

1:TransactionAutoComplete(默认值Flase) 表示相应操作的执行是否自动纳入一个事务中;

2:TransactionScopeRequired(默认值true) 表示如果执行过程没有抛出异常,完成后将自动提交事务;

    public class BankingService : IBankingService
{
[OperationBehavior(TransactionScopeRequired = true)]
public void Transfer(string fromAccountId, string toAccountId, double amount)
{
}
}

四:事务相关的服务行为

ServiceBehaviorAttribute定义的4个与事务相关的属性;

1:TransactionIsolationLevel:事务的隔离级别,默认值为IsolationLevel.Seriallizable;

2:TransactionTimeout 以字符串形式定义事务的超时时限;

3:TransactionAutoCompleteOnSessionClose 在会话正常结束(没有异常)之后是否自动提交或完成开启的事务,默认值False

4:ReleaseServiceInstanceOnTransactionComplete 当事务完成之后是否要将服务实例释放掉,默认值False

    [ServiceBehavior(TransactionIsolationLevel=IsolationLevel.ReadCommitted,TransactionTimeout="00:05:00",
TransactionAutoCompleteOnSessionClose=true)]
public class WithdrawService : IWithdrawService
{
[OperationBehavior(TransactionScopeRequired = true)]
public void Withdraw(string accountId, double amount)
{
}
}

注意:若契给服务ServiceBehavior定义的那些属性后 若在其内的操作没有一个设置OperationBehavior(TransactionScopeRequired = true)则会报错;

也可以使用配置方式:

      <service name="Service.DepositService" behaviorConfiguration="transactionBehavior">
<endpoint binding="customBinding"
contract="Service.Interface.IDepositService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="transactionBehavior">
<serviceTimeouts transactionTimeout="00:30:00"/>
</behavior>
</serviceBehaviors>
</behaviors>

在事务流转的场景中,流入的事务和目标服务的事务隔离级别必须一致;否则会报异常;客户端调用代码如下;

没有定义事务的级别则采用默认隔离级别Serializable;

using System.ServiceModel;
using Service.Interface;
using System.Transactions; namespace TransactionalService.Client
{
class Program
{
static void Main(string[] args)
{
using (ChannelFactory<IBankingServicee> channelFactory = new ChannelFactory<IBankingServicee>("bankingservice"))
{
IBankingServicee bankingservice = channelFactory.CreateChannel();
using (TransactionScope transactionScope = new TransactionScope())
{
bankingservice.Transfer();
transactionScope.Complete();
}
}
}
}
}

五:事务实例:

接下来将通过一个简单的事实来介绍一下WCF事务;因为比较简单所以后面直接提供源代码的下载[源代码里面还包括其它信息]:

1:首先是契约的定义:

using System.ServiceModel;
using System.Runtime.Serialization;
using Service.Model;
namespace Service.Interface
{
[ServiceContract(SessionMode=SessionMode.Required)]
public interface ITransactionDemo
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void AddAccount(AccountModel model); [OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void OutAccount(AccountModel model);
}
}

2:契约服务的实现内容

using Service.Interface;
using Service.Model;
using System.Data.Common;
using System.ServiceModel;
using Service.DAL;
using System.EnterpriseServices;
using System.Transactions;
namespace Service.ServerDeom
{
[ServiceBehavior(TransactionIsolationLevel = IsolationLevel.Serializable,
TransactionTimeout = "00:05:00",
TransactionAutoCompleteOnSessionClose = true)]
public class TransactionDemoService:ITransactionDemo
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = false)]
public void AddAccount(AccountModel model)
{
try
{
AccountDAL.Update(model);
}
catch (Exception ex)
{
throw new FaultException(new FaultReason(ex.Message));
}
} [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = false)]
public void OutAccount(AccountModel model)
{
try
{
AccountDAL.Update(model);
}
catch (Exception ex)
{
throw new FaultException(new FaultReason(ex.Message));
}
}
}
}

3:宿主服务的配置

<bindings>
<netTcpBinding>
<binding name="portSharingBinding" portSharingEnabled="true"></binding>
</netTcpBinding>
<ws2007HttpBinding>
<binding name="transactionalTcpBinding" transactionFlow="true" />
</ws2007HttpBinding>
</bindings>
<services>
<service name="Service.ServerDeom.TransactionDemoService">
<endpoint address="http://127.0.0.1:3724/ExcptDivideService"
binding="ws2007HttpBinding"
bindingConfiguration="transactionalTcpBinding"
contract="Service.Interface.ITransactionDemo"/>
</service>
</services>

4:客户端的配置信息

      <endpoint name="TransactionAccount" address="http://127.0.0.1:3724/ExcptDivideService"
binding="ws2007HttpBinding"
contract="Service.Interface.ITransactionDemo"/>

5:客户端的实现代码:

            AccountModel model = new AccountModel();
model.Money = 20;
model.Uid = 1;
model.ID = 1; AccountModel OutModel = new AccountModel();
OutModel.ID = 2;
OutModel.Uid = 2;
OutModel.Money = 1; using (ChannelFactory<ITransactionDemo> ChannelFactory = new ChannelFactory<ITransactionDemo>("TransactionAccount"))
{
ITransactionDemo proxy = ChannelFactory.CreateChannel();
using (TransactionScope transactionScope = new TransactionScope())
{
proxy.AddAccount(model);
proxy.OutAccount(OutModel);
transactionScope.Complete();
}
}

本文是学习[WCF全面解析]中有关事务编程的内容;针对WCF事务编程做一个简单的要点记录;

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。  因为,我的写作热情也离不开您的肯定支持。

感谢您的阅读,[源代码下载]

 
 
 
标签: WCF

WCF学习笔记之事务编程的更多相关文章

  1. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  2. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  3. Hadoop学习笔记(7) ——高级编程

    Hadoop学习笔记(7) ——高级编程 从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成 ...

  4. WCF学习笔记之传输安全

    WCF学习笔记之传输安全 最近学习[WCF全面解析]下册的知识,针对传输安全的内容做一个简单的记录,这边只是简单的记录一些要点:本文的内容均来自[WCF全面解析]下册: WCF的传输安全主要涉及认证. ...

  5. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  6. WCF 学习笔记之双工实现

    WCF 学习笔记之双工实现 其中 Client 和Service为控制台程序 Service.Interface为类库 首先了解契约Interface两个接口 using System.Service ...

  7. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  8. MySQL实战45讲学习笔记:事务隔离级别(第三讲)

    一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...

  9. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

随机推荐

  1. Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)

    创Android Applicationproject:采用Eclipse的Android插入ADT创Androidproject,project名字Gpio,创建完成后,project文件夹pack ...

  2. cfs

    转自:http://www.cnblogs.com/openix/p/3254394.html 下文中对于红黑树或链表组织的就绪队列,统称为用队列组织的就绪队列.                    ...

  3. HQL语句大全

    第 15 章 HQL: Hibernate查询语言 Hibernate配备了一种很强大的查询语言,这样的语言看上去很像SQL.可是不要被语法结构 上的类似所迷惑,HQL是很有意识的被设计为全然面向对象 ...

  4. C++外观设计模式模式(三)

    3.外观模式总结 引入了外观类.解除了客户类与子系统的耦合性.客户类不须要直接操作子系统,而是由外观类负责处理,对client而言是透明的,客户类仅仅须要操作外观类就能够了,符合"迪迷特法则 ...

  5. MVC验证10-到底用哪种方式实现客户端服务端双重异步验证

    原文:MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 本篇将通过一个案例来体验使用MVC的Ajax.BeginForm或jQuery来实现异步提交,并在客户端和服务端双双获得验证.希望能梳 ...

  6. Node+Express+MongoDB + Socket.io搭建实时聊天应用

    Node+Express+MongoDB + Socket.io搭建实时聊天应用 前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战 ...

  7. JS中childNodes深入学习

    原文:JS中childNodes深入学习 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <ti ...

  8. 修改MvcPager分页控件以适用Bootstrap 效果(含英文版,可下载)

    软件开发分页效果必不可少,对于Asp.Net MVC 而言,MvcPager 是个不错的选择.请访问http://www.webdiyer.com/mvcpager/ 由于自带的分页样式不能和项目整体 ...

  9. 探秘IntelliJ IDEA 13测试版新功能——调试器显示本地变量

    IntelliJ IDEA在业界被公认为最好的Java开发平台之一,JetBrains公司将在12月正式发布IntelliJ IDEA 13版本. 现在,小编将和大家一起探秘密IntelliJ IDE ...

  10. Inno Setup 网页显示插件 webctrl

    原文:Inno Setup 网页显示插件 webctrl ; -- Example.iss -- ; restools ; http://restools.hanzify.org ; 插件名:webc ...