`

《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按部就班学习系列2_WCF服务契约概述》

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

    基于ARM架构服务器部署docker-compose

    基于arm64版本的docker-compose文件

    附件3-4:台区智能融合终端全性能试验增值税发票开具确认单.docx

    台区终端电科院送检文档

    埃夫特机器人Ethernet IP 通讯配置步骤

    埃夫特机器人Ethernet IP 通讯配置步骤

    rv320e机器人重型关节行星摆线减速传动装置研发.rar

    rv320e机器人重型关节行星摆线减速传动装置研发

    气缸驱动爬杆机器人的设计().zip

    气缸驱动爬杆机器人的设计().zip

    软件工程中期答辩1234567

    56tgyhujikolp[

    基于OpenCV的数字身份验证系统:人脸检测、训练与识别的Python实现

    内容概要:本文档提供了基于OpenCV的数字身份验证系统的Python代码示例,涵盖人脸检测、训练和识别三个主要功能模块。首先,通过调用OpenCV的CascadeClassifier加载预训练模型,实现人脸检测并采集多张人脸图像用于后续训练。接着,利用LBPH(局部二值模式直方图)算法对面部特征进行训练,生成训练数据集。最后,在实际应用中,系统能够实时捕获视频流,对比已有的人脸数据库完成身份验证。此外,还介绍了必要的环境配置如依赖库安装、文件路径设置以及摄像头兼容性的处理。 适合人群:对计算机视觉感兴趣的研发人员,尤其是希望深入了解OpenCV库及其在人脸识别领域的应用者。 使用场景及目标:适用于构建安全认证系统的企业或机构,旨在提高出入管理的安全性和效率。具体应用场景包括但不限于门禁控制系统、考勤打卡机等。 其他说明:文中提供的代码片段仅为基本框架,可根据实际需求调整参数优化性能。同时提醒开发者注意隐私保护法规,合法合规地收集和使用个人生物识别信息。

    Java并发编程面试题详解:123道经典题目解析与实战技巧

    内容概要:本文档详细介绍了Java并发编程的核心知识点,涵盖基础知识、并发理论、线程池、并发容器、并发队列及并发工具类等方面。主要内容包括但不限于:多线程应用场景及其优劣、线程与进程的区别、线程同步方法、线程池的工作原理及配置、常见并发容器的特点及使用场景、并发队列的分类及常用队列介绍、以及常用的并发工具类。文档旨在帮助开发者深入理解和掌握Java并发编程的关键技术和最佳实践。 适合人群:具备一定Java编程经验的研发人员,尤其是希望深入了解并发编程机制、提高多线程应用性能的中级及以上水平的Java开发者。 使用场景及目标:①帮助开发者理解并发编程的基本概念和技术细节;②指导开发者在实际项目中合理运用多线程和并发工具,提升应用程序的性能和可靠性;③为准备Java技术面试的候选人提供全面的知识参考。 其他说明:文档内容详尽,适合用作深度学习资料或面试复习指南。建议读者结合实际编码练习,逐步掌握并发编程技巧。文中提到的多种并发工具类和容器,均附有具体的应用场景和注意事项,有助于读者更好地应用于实际工作中。

    个人健康与健身追踪数据集,包含了日常步数统计、睡眠时长、活跃分钟数以及消耗的卡路里,适用于数据分析、机器学习

    这个数据集包含了日常步数统计、睡眠时长、活跃分钟数以及消耗的卡路里,是个人健康与健身追踪的一部分。 该数据集非常适合用于以下实践: 数据清洗:现实世界中的数据往往包含缺失值、异常值或不一致之处。例如,某些天的步数可能缺失,或者存在不切实际的数值(如10,000小时的睡眠或负数的卡路里消耗)。通过处理这些问题,可以学习如何清理和准备数据进行分析。 探索性分析(发现日常习惯中的模式):可以通过分析找出日常生活中的模式和趋势,比如一周中哪一天人们通常走得最多,或是睡眠时间与活跃程度之间的关系等。 构建可视化图表(步数趋势、睡眠与活动对比图):将数据转换成易于理解的图形形式,有助于更直观地看出数据的趋势和关联。例如,绘制步数随时间变化的趋势图,或是比较睡眠时间和活动量之间的关系图。 数据叙事(将个人风格的追踪转化为可操作的见解):通过讲述故事的方式,把从数据中得到的洞察变成具体的行动建议。例如,根据某人特定时间段内的活动水平和睡眠质量,提供改善健康状况的具体建议。

    《基于YOLOv8的港口船舶靠泊角度偏差预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    nginx 访问访问日志按天切割 shell脚本

    nginx

    《基于YOLOv8的核废料运输容器密封性检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的农业无人机播种深度监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    uniapp知识付费(流量主)demo

    模拟知识付费小程序,可流量主运营模式

    java高并发之分片上传

    什么是普通上传 调用接口一次性完成一个文件的上传。 普通上传2个缺点 文件无法续传,比如上传了一个比较大的文件,中间突然断掉了,需要重来 大文件上传太慢 解决方案 分片上传

    英二2010-2021阅读理解 Part A 题干单词(补).pdf

    英二2010-2021阅读理解 Part A 题干单词(补).pdf

    2023-04-06-项目笔记 - 第四百五十五阶段 - 4.4.2.453全局变量的作用域-453 -2025.04-01

    2023-04-06-项目笔记-第四百五十五阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.453局变量的作用域_453- 2025-04-01

    友缘公司钢材管理平台微信小程序的设计与实现.zip

    微信小程序项目课程设计,包含LW+ppt

Global site tag (gtag.js) - Google Analytics