`

《WCF按部就班学习系列7_WCF事务概述》

阅读更多

《WCF按部就班学习系列7_WCF事务概述》,本文的主要结构为:1)WCF事务的概述2)WCF事务属性、事务管理、事务协议、事务管理器、实例模式与事务、事务编程概述3)实现代码分析及运行结果4)源码下载5)下一篇计划6)参考说明
(1)WCF事务的概述(what)
1.使用事务是维持系统一致性并合理实现错误恢复的最好方式。事务往往是一个复杂操作的集合,这个操作集就如同一个原子操作( Atomic Operation) 一样,其中任何一个单独操作的失败都会导致整个集合的失败。如图7-1所示,当事务正在进行时,允许系统处于短暂的不一致状态,一旦事务结束,则必须保证系统的一致状态,或者是新的一致状态(B).或者是事务开始前系

统的原始一致状态(A)。图7-1事务对系统在一致状态之间的迁移

2.如果事务执行顺利,并且成功地将系统由一致性状态A迁移到·致性状态B,我们把它称为提交的事务(Committed Transaction)。假如事务在执行过程中遇到了错误,并且回滚了之前已经成功完成的中间步骤,我们则把它称作中止的事务( Aborted Transaction)。假如事务既没能提交也没能中止,则将它称为悬疑的事务(ln-Doubt Transaction)。
3. 什么是事务呢?其实这个事一个数据库系统中的一个概念。事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
4.例如,银行转帐:通常包括两个操作:
(1)从一个帐号A扣款;
(2)使另一个帐号B增款。
这两个操作要么都执行,要么都不执行。在银行系统里,数据库系统执行相关的命令来完成两个操作。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保证数据一致性。连个账号的金额不会出现错误。保证转账操作的正确完成。
(2)WCF事务属性、事务管理、事务协议、事务管理器、实例模式与事务、事务编程概述
2.1WCF事务属性
1.原子性(Atomic)、一致性(Consistent)、隔离性(Isolated)和持久性(Durable)。设计事务性服务时,我们必须符合ACID的要求,它们都是必备的。WCF对事务属性有极其严格的要求。
<1>原子性:
  事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。一个事务要被完全的无二义性的做完或撤消。在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态。比如转账事务中的两个操作,要么全执行,要么全部执行。
<2>一致性:
  事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,A账户里10000元,B账户0元,转账成功以后。A和B账户的总额保持不变。还是10000元。不会因为转账成功就增加了总额。
<3>隔离性:
  由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。串行执行事务:在一个事务执行过程中,数据的中间的(可能不一致)状态不应该被暴露给所有的其他事务。两个并发的事务应该不能操作同一项数据。数据库管理系统通常使用锁来实现隔离。
<4>持久性:
WCF支持分布式事务,也就是说事务可以跨越服务边界、进程、机器、网络,在多个客户端和服务之间存在。而与此对应的事务数据信息传播和管理的协议不同。
2.2事务管理
1.WCF服务可以直接作用于事务型资源,并通过显式地使用类似ADO.NET提供的编程模型来管理事务。
2.例7-1:显式地管理事务

3.通过调用connection对象的BeginTransaction()方法,可以获得代表底层数据库事务的一个对象。函数BeginTransaction()返回了一个实现了IDbTransaction接口的对象,通过它管理事务。当数据库被登记到事务中时,并不会真正执行任何请求,而仅仅是将针对事务的请求记录下来。假如对数据库的所有更新或其他改变都满足一致性要求,并且没有发生错误,那么只要简单地调用事务对象的Commit()方法,就将指示被跳过.catch语句则通过调用Rollback()方法中止事务。中止事务要求数据库丢弃目前记录的所有变更。
2.3事务协议
1.WCF 使用不同的事务协议来控制事务执行范围(execution scope)。 事务协议的出现时为了实现分布式环境事务传播。
2.Lightweight: 仅能在同一程序域的上下文中传递事务,无法跨越程序域和服务边界。只能在服务内部或外部适用,同时它也是性能最好的一种协议。不过这种协议似乎没什么用处,因为 WCF Framework 中没有任何一种 Binding 支持此协议。
3.OleTx: 允许事务跨越程序域、进程或机器边界。使用 RPC 调用,采取 Windows 专用二进制格式。无法跨越防火墙,也不能和其他异种平台进行整合。多用于 Windows 体系的 Intranet 环境。
4.WS-Atomic(WSAT): 和 OleTx 相似,同样允许事务跨越程序域、进程或机器边界。和 OleTx 不同,WSAT 是一种工业标准,采取 HTTP 协议,TEXT 编码,可以跨越防火墙。虽然 WSAT 也能用于 Intranet,但多数时候它用于 Internet 环境。
5.事务协议的配置只有在事务传播的情况下才有意义。WCF在预定义绑定中实现了标准的WSAtomicTransaction(WS-AT)协议和Microsoft专有的OleTx协议,这些协议可以用来在消息中加入事务状态的信息。WS绑定可以使用多个WSAT事务协调器,跨越Internet。但是如果只有一个事务协调器,OleTx协议将是默认的协议。我们可以编程或者配置文件设置事务协议。
<bindings>
<netTcpBinding>
<binding name = "TransactionalNetTCP"
transactionFlow = "true"
transactionProtocol = "WSAtomicTransactionOctober2004"
/>
</netTcpBinding>
</bindings>
2.4事务管理器
1.曾经提及依靠自身管理事务实属无奈之举,最好的解决办法是找一个第三方工具如事务管理器,为我们的客户端和服务管理两阶段提交协议。如图7-2所示,WCF在一一个提供者模型中可以与三个不同的事务管理器一起工作,而不只限于一个。

2.这三个事务管理器分别是轻量级事务管理器( LTM)、核心事务管理器(KTM)和分布式事务协调器(DTC)。WCF根据平台使用的功能,应用程序的事执行任务、调用的服务以及所消耗的资源分配合适的事务管理器。通过自动地分配事务管理器.WCF将事务管理从服务代码和用到的事务协议中解耦出来,开发者不必再为事务管理器而苦恼了。
3.LTM:轻量级事务管理器,它只能管理本地事务,单个应用程序域中的事务,它根据轻量级事务协议来管理和实现两阶段提交协议。 LTM是一种高效的资源管理器。它只能管理本地事务。在.NET2.0中经常使用。WCF事务编程中我们可以使用其来管理本地事务。
4.KTM:在Vista核心中的新组件,其目的是方便进行大量的错误恢复工作,而且过程几乎是透明的,而KTM之所以可以做到这一点,是因为它可以作为事务客户端接入的一个事务管理器进行工作。与LTM一样, KTM只能管理一个本地服务的事务。而且不支持事务传播给别的服务。
5.DTC:.NET Framework 依靠 MTS/COM+ 服务来支持自动事务。COM+ 使用 Microsoft Distributed Transaction Coordinator (DTC) 作为事务管理器和事务协调器在分布式环境中运行事务。分布式事务协调器 (DTC) 服务可协调更新两个或多个受事务保护的资源的事务, 如数据库、消息队列、文件系统等等。这些受事务保护的资源可能位于单个计算机上,或分布在许多网络计算机上。DTC可以使用OleTx或者WSAT协议。WCF可以借助DTC实现分布式事务机制。DTC可以创建事务、传播事务信息、收集全部事务的结果、通知事务管理器提交或者回滚事务。
6. 在分布式事务中,事务管理器A会向参与事务的其他机器发出调用请求。其它机器拦截请求。获取事务ID,启动本地事务。其他机器同时启动本地资源管理器登记。执行两阶段提交协议。最后根据全部的结果。执行第二阶段是否提交和回滚。DTC管理分布式事务如图7-3所示:

7.事务资源管理器会根据事物执行的实际情况和需求进行提升。最初的事务由LTM管理,这样能获得最好的性能;
如果事务访问的是KRM资源,开始会由KTM管理事务。当事务访问其它持久化资源或者其它事务并传播事务时,事务就会提升为DTC事务。事务的如果为旧资源,管理器会自动提升为DTC,资源与事务管理器之间的关系如下图7-4所示:

本地事务ID和分布式事务ID都可以通过事务类的属性TransactionInformation获得。string LocalIdentifier和GuidDistributedIdentifier。
2.5实例模式与事务
1.到目前为止我们可以看到,除非将事务型服务的实例模式设为单调模式,其他实例模式都会给编程模型带来与其优点不相称的复杂性。虽然WCF功能强大,并且提供了可扩展性以支持范围最广的配置组合,但仍然推荐大家尽可能使用单调服务。如果你能够接受单例模式带来的性能损失,那么使用易失性资源管理器的事务型单例服务也是可以接受的。表7-3对服务的实例管理模式与事务的关系做了一个总结,列出了到目前为止所讨论过的所有配置选项。注意,图7-5只是列出了可行的配置以及它们所产生的效果,其他一些组合在技术上或许是允许的,但是却没有意义。最后,还有一些组合则是WCF明确禁止的。

2.回调客户端具有四种配置模式:Service、Service/Callback. Callback以及None,它们类似于服务的事务模式,只是现在服务扮演了客户端的角色,而回调则扮演了之前服务的角色。
例如,要想将回调配置为Service事务模式(即回调总是使用服务的事务),应遵循以下步骤:
1. 使用一个与事务相关的双向绑定,并开启事务流。
2. 将回调操作的事务流选项设成强制要求。
3. 将回调操作配置成需要一个事务范围。
2.6事务编程
1.下面我们来介绍一下WCF事务编程。WCF事务范围可以涉及到客户端、服务端。当然这个取决于你项目具体的配置。在WCF的事务模式主要由绑定协议、事务流属性、事务范围属性决定。在

WCF所有的绑定协议中不是所有的协议都支持事务。事务流属性TransactionFlowAttribute 只能用于服务方法(Operation/Method)上,它允许我们进行不同的事务参与设置。注意不能为

IsOneWay=true 的服务设置事务流支持:
TransactionFlowOption.NotAllowed: 不参与任何事务。(默认值)
TransactionFlowOption.Allowed: 允许参与事务。如果调用方(客户端)和服务Binding启用了事务,则参与。
TransactionFlowOption.Mandatory: 强制启用事务。调用方(客户端)和服务 Binding 必须启用事务才能调用本服务。
2.这样综合作用,匹配的结果就是3种启动事务的模式。分别是:Client/Service transaction、Client transaction、Service transaction模式。他们分别的设置情况是:
3.Client/Service transaction,最常见的一种事务模型,通常由客户端或服务本身启用一个事务。设置步骤:
[1] 选择一个支持事务的Binding,设置 TransactionFlow = true。
[2] 设置 TransactionFlow(TransactionFlowOption.Allowed)。
[3] 设置 OperationBehavior(TransactionScopeRequired=true)。
4.Client transaction,强制服务必须参与事务,而且必须是客户端启用事务。设置步骤:
[1] 选择一个支持事务的Binding,设置 TransactionFlow = true。
[2] 设置 TransactionFlow(TransactionFlowOption.Mandatory)。
[3] 设置 OperationBehavior(TransactionScopeRequired=true)。
5.Service transaction,服务必须启用一个根事务,且不参与任何外部事务。设置步骤:
[1] 选择任何一种Binding,设置 TransactionFlow = false(默认)。
[2] 设置 TransactionFlow(TransactionFlowOption.NotAllowed)。
[3] 设置 OperationBehavior(TransactionScopeRequired=true)。

(3)实现代码分析及运行结果
3.1WCFService(服务源码分析)

3.2WCFHost(宿主源码分析)

运行结果见图7-6服务器运行结果

3.3WCFClient(客户端源码分析)

运行结果见图7-7客户端运行结果

(4)源码下载
http://download.csdn.net/source/3036909
(5)下一篇计划
下一篇主要介绍WCF中并发管理的相关知识。
(6)参考说明
1.《Programming WCF Services》
2.http://www.cnblogs.com/frank_xl/archive/2009/06/01/1456398.html

分享到:
评论

相关推荐

    《WCF按部就班学习系列8_WCF并发管理概述》

    **限流概述**是WCF并发管理中的另一个重要概念。限流是控制服务处理速率的一种机制,可以防止过多的并发请求导致系统资源耗尽。WCF通过设置服务的行为配置,可以限制并发请求数、最大接收消息数等,以达到服务级别的...

    《WCF按部就班学习系列1_WCF基础知识概述》

    在“WCF按部就班学习系列1”中,我们将深入探讨WCF的基础知识,包括服务契约、宿主定义等关键概念。 **服务契约** 服务契约是WCF中的核心概念,它定义了服务提供的操作及其交互方式。服务契约通过接口(Interface...

    《WCF按部就班学习系列4_WCF实例管理概述》

    WCF实例管理的概述,WCF服务实例激活类型三种方式概述和单例服务的完整代码。

    《WCF按部就班学习系列6_WCF错误概述》

    **WCF错误概述** Windows Communication Foundation (WCF) 是微软提供的一个全面的、统一的编程模型,用于构建面向服务的应用程序。在WCF中,错误处理是不可或缺的一部分,确保服务的稳定性和可靠性。本篇文章将...

    《WCF按部就班学习系列5_WCF操作概述》

    **WCF(Windows Communication Foundation)**是微软推出的一种面向服务的通信框架,它提供了一种构建高度互操作的、安全的、可靠的服务的方法。在WCF中,**操作**是服务的基本工作单元,用户通过调用这些操作来与...

    《WCF按部就班学习系列2_WCF服务契约概述》

    在本文中,我们将深入探讨WCF(Windows Communication Foundation)服务契约这一核心概念,以及如何通过实例来...这只是一个基础的起点,WCF还有许多高级特性和配置选项,如事务、安全、消息队列等,等待你进一步探索。

    《WCF按部就班学习系列3_WCF数据契约概述》

    学习这个系列,初学者可以理解WCF的基本架构,掌握如何定义和使用数据契约,创建服务契约,以及如何在不同的环境中(如IIS、自承载等)部署和运行WCF服务。同时,通过实际的代码示例,有助于深入理解和应用WCF技术。

    WCF服务编程中文版_1

    当前pdf总共有7个部分: WCF服务编程中文版_1 WCF服务编程中文版_2 WCF服务编程中文版_3 WCF服务编程中文版_4 WCF服务编程中文版_5 WCF服务编程part1 WCF服务编程part2

    WCF_AsyncCall.rar_WCF_AsyncCall_wcf_wcf winform_并发_线程池

    C#WCF 服务并发管理,编程源代码,包括线程池的例子。

    WCF服务编程中文版_3

    当前pdf总共有7个部分: WCF服务编程中文版_1 WCF服务编程中文版_2 WCF服务编程中文版_3 WCF服务编程中文版_4 WCF服务编程中文版_5 WCF服务编程part1 WCF服务编程part2

    WCF_idesign_1 WCF_idesign_1 WCF_idesign_1

    【描述】"WCF_idesign_1WCF_idesign_1WCF_idesign_1WCF_idesign_1WCF_idesign_1" 的重复性描述可能暗示着这是关于深入学习或者多次强调WCF的特定设计原则或实践。WCF的设计理念包括服务导向架构(SOA),它支持多种...

    WCF服务编程中文版_5

    当前pdf总共有7个部分: WCF服务编程中文版_1 WCF服务编程中文版_2 WCF服务编程中文版_3 WCF服务编程中文版_4 WCF服务编程中文版_5 WCF服务编程part1 WCF服务编程part2

    WCF服务编程中文版_2

    当前pdf总共有7个部分: WCF服务编程中文版_1 WCF服务编程中文版_2 WCF服务编程中文版_3 WCF服务编程中文版_4 WCF服务编程中文版_5 WCF服务编程part1 WCF服务编程part2

    WCF.rar_ChannelFactory_WCF DynamicProxy_WCF 动态_wcf 动态调用_动态WCF

    在WCF中,可以使用`Castle.DynamicProxy`库或者.NET Framework的`System.Reflection.Emit`命名空间来创建动态代理,从而在调用WCF服务时添加日志、事务控制等特性,而无需修改服务契约接口。 **WCF动态调用** 是指...

    wcf.rar_wcf_wcf C#

    标题中的“wcf.rar_wcf_wcf C#”暗示了这是一个关于Windows Communication Foundation(WCF)的项目,其中包含了C#语言的实现。WCF是微软.NET Framework的一部分,用于构建可互操作的分布式系统,允许服务提供者和...

    WCF教程(Pro_WCF_Practical_Microsoft_SOA_Implementation-3297)

    本教程“Pro_WCF_Practical_Microsoft_SOA_Implementation-3297”专注于实践性学习,帮助开发者深入理解WCF的核心概念和技术,以及如何在实际项目中有效应用。通过一系列示例,你将学习到如何创建、配置和服务的调试...

    WCF大文件断点下载.rar_wcf_wcf文件上传_worthsdn_下载_远程下载

    在.NET平台上,Windows Communication Foundation(WCF)是一个强大的服务架构,用于构建分布式应用程序。本教程主要探讨了如何利用WCF实现大文件的断点下载功能,这是一个在远程文件传输中非常实用的技术。WCF文件...

    WCF.rar_wcf_whalewpf

    在“WCF.rar_wcf_whalewpf”压缩包中,包含的文件主要涉及WCF服务的创建、调用以及不同宿主方式的实现。** 1. **WCFClient**: 这个文件夹很可能包含了WCF服务的客户端应用程序,用于调用WCF服务。在WCF中,客户端...

    WCF_Test.rar_tastevk1_wcf_wcf双工

    标题中的"WCF_Test.rar_tastevk1_wcf_wcf双工"暗示了这是一个关于Windows Communication Foundation(WCF)的示例项目,特别关注的是双工通信模式。WCF是微软提供的一种.NET框架,用于构建分布式应用程序,它允许...

Global site tag (gtag.js) - Google Analytics