[WCF编程]12.事务:事务概述
一、事务概述
维护系统一致性和正确地处理错误恢复挑战的最佳方式是使用事务。
一个事务就是一个复杂操作的集合,这个集合中任何一个操作的失败都会引起整个集合的失败。
尽管在事务进行时系统被允许暂时出于不一致的状态,但是一旦事务结束,系统一定会处于一直的状态。
事务资源
事务编程需要资源(如数据库或消息队列)一起协作,这类资源要能够参与事务并回滚在事务中发生的变化。
一般情况下,我们必须通知这些希望执行事务性工作的资源,这个行为称为在事务中登记资源。一些资源支持自动登记,也就是说它们能够检测到自身是否被事务访问,并完成登记。资源呢一旦被登记,我们就能够对它执行操作。如果没有错误发生,要求提交资源的所有状态发生改变;剐有错误发生,要求回滚资源的状态的所有变化。
在一个事务处理中,不要访问非事务的资源很关键(如文件系统),因为事务一旦被中止,是不会回滚这些非事务资源上的改变。
事务属性
当在面向服务的应用程序中使用事务时,必须遵守四个核心属性,也就是ACID:原子性(Atomic)、一致性(Consistent)、隔离性(Isolated)和持久性(Durable)。
原子性
为了是事务具有原子性,当一个事务结束时,必须把对资源状态已经做的所有改变视为一个原子的,不可分割的操作。
当事务结束时,事务是不容许遗留任何工作在后台处理,因为这些操作违反了原子性。所有事务产生的操作必须包含在事务中。
事务作为一个整体,要么成功,要么失败。
一致性
一致性意味着事务必须是系统处于一个一致的状态。一致性和原子性不同。即使状态的所有改变被作为一个原子操作提交了,事务也必须保证所有的改变都是一致的。
事务必须做到的就是让系统从一个一致的状态转移到另一个一致的状态。
隔离性
隔离性意味着没有其它的实体在事务过程中能够看到资源的状态,因为中间状态很可能是不一致的。即使中间状态是一致的,事务依然能够中止,所有的改变也可以被回滚。
参与事务的资源必须对事务所访问的数据枷锁,以防止任何其它代码的访问,同时必须在事务提交或中止取消对数据的所保护,以便其它代码可以访问。
持久性
持久性的意思是一旦成功提交,基于持久化资源(比如数据库)的数据将会被持久化,对数据的改变是永久性的。
二、事务管理
WCF服务能够直接处理事务性的资源,并通过显式地使用编程模型(如ADO.NET)来管理事务。如下,使用这个模型,可以显式地启动和管理事务。
[ServiceContract]
interface IMyContract
{
[OperationContract]
void MyMethod();
}</span><span style="color: #0000ff">class</span><span style="color: #000000"> MyService : IMyContract
{
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> MyMethod()
{
</span><span style="color: #0000ff">string</span> connectionString = <span style="color: #800000">"</span><span style="color: #800000">....</span><span style="color: #800000">"</span><span style="color: #000000">;
</span><span style="color: #0000ff">using</span> (IDbConnection connection=<span style="color: #0000ff">new</span><span style="color: #000000"> SqlConnection(connectionString))
{
connection.Open();
</span><span style="color: #0000ff">using</span> (IDbCommand command=<span style="color: #0000ff">new</span><span style="color: #000000"> SqlCommand())
{
command.Connection </span>=<span style="color: #000000"> connection;
</span><span style="color: #0000ff">using</span> (IDbTransaction transaction =<span style="color: #000000">connection.BeginTransaction())
{
command.Transaction </span>=<span style="color: #000000"> transaction;
</span><span style="color: #0000ff">try</span><span style="color: #000000">
{
</span><span style="color: #008000">//</span><span style="color: #008000">这里操作数据库</span>
transaction.Commit(); <span style="color: #008000">//</span><span style="color: #008000">提交事务</span>
}
catch (Exception)
{
transaction.Rollback(); //回滚事务
throw;
}
}
}
}
}
}事务性管理的挑战
虽然编程模型十分简单,不需要服务执行任何事务,但是这个最适合单个客户端调用单个数据库,服务会启动并管理事务,如下所示:
但是,一个面向服务的应用系统,客户端一次于多个服务交互,并且涉及到多个资源,如下图所示
现在问题是,哪一个参与的服务负责发起事务并管理资源?如果大家都服务的话,就会以多个事务结束;如果服务里包含过多的业务逻辑将会引起服务、资源之间紧密耦合的问题;再说哪个服务服负责提交或回滚事务呢;这个服务如何直到其它事务的 情况呢……
一种可行的方法是,通过为事务协调增加代码可以把客户端与服务结合起来,但是这个比较脆弱,业务流程或服务数量变化都会导致这个方法失效。
三、分布式事务
刚才介绍的事务类型 称为分布式事务。一个分布式事务包含两个或多个独立的服务(通常在不同的执行上下文里),或者一个服务包含多个事务资源。对于一个分布式事务,需要依赖两阶段提交协议和一个事务管理器。事务管理器是管理事务的第三方,由它来负责客户端和服务端两阶段提交协议。
四 、两阶段提交协议
为了克服分布式事务的复杂性,事务管理器使用一个称作两阶段提交协议的事务管理协议来决定事务提交或回滚。两阶段提交协议在分布式事务中强调原子性与一致性。让WCF支持多客户端、服务以及资源的分布式事务。当事务工作时,事务管理器会进行监督。当有新的服务加入事务,以及访问到的资源都会与这个事务关联。服务执行业务逻辑资源,资源记录事务内所做的修改。在事务期间,所有的服务(参与到事务里的客户端)必须通过投票决定它们是否提交事务或终止事务。
当事务结束时,事务管理器会检查参与事务投票的所有服务。如果任何一个服务或客户端投票终止事务,事务就不会提交:所有在事务期间对资源的修改都会被抛弃。如果所有的参与者都投票提交事务,那么就会启动两阶段提交协议:
第一阶段,事务管理器询问参与到事务里的所有资源是否对于提交事务期间的修改还有什么意见。注意,事务管理器不会命令资源提交修改,而只是询问它们的意见。第一阶段结束时,事务管理器会综合所有的资源投票结果。
第二阶段,根据投票结果来执行。如果所有的资源都投票提交事务,那么事务管理器会告诉所有的资源提交修改。但是,如果任何一个资源没有提交修改,那么资源管理器会告诉其余的资源回滚修改,然后终止事务,并把系统恢复到事务之前的状态。
五、资源管理器
资源管理器(RM)是由某个事务管理器管理的、支持原子操作和两阶段提交协议的资源。这个资源必须可以检测自己是否被包含进了事务,而且是否有且只有一次的自动那个加入事务列表。RM可以处理持久化和非持久化资源,比如,事务性整数、字符串和集合。虽然RM必须支持两阶段提交协议,但是,他可以选择使用优化协议。这个协议称为一阶段提交协议,事务管理器(TM)会一次性通知事务管理器执行的结果。
资源管理器在整个事务模型中主要承担如下几种职能:
- 帮助应用实现对目标资源的操作;
- 注册到相应的事务管理器,以便事务回滚得时候可以从事务管理器中接收到恢复请求,实现对数据的恢复;
- 向相应的事务管理器报告本地事务的结果;
[WCF编程]12.事务:事务概述的更多相关文章
- [WCF编程]12.事务:服务事务编程(下)
一.投票与提交 虽然WCF负责事务传播及两阶段提交协议的管理工作,但是 她不知道事务是否应该提交或终止.这需要根服务告诉WCF应该何时启动两阶段提交协议.是提交还是终止.WCF提供了两种编程模式来对事 ...
- [WCF编程]12.事务:事务传播
一.事务传播概述 WCF可以跨越服务边界传递事务.这可以让服务参与到客户端事务里,客户端还可以在同一个事务里调用多个服务.客户端本身不一定是WCF服务.客户端事务是否传播到服务端可以通过绑定和操作契约 ...
- [WCF编程]12.事务:服务事务编程(上)
一.设置环境事务 默认情况下,服务类和操作没有环境事务,即使客户端事务传播到服务端也是如此. 尽管强制事务流从客户端传播过来,但服务端的环境事务依旧为null.为了启用环境事务,每个操作必须告诉WCF ...
- [WCF编程]12.事务:事务协议与管理器
一.事务协议 总体来说,WCF开发人员不需要涉及事务协议与管理器.我们应该依赖WCF来选择相应的事务协议和管理器,重点关注业务逻辑的实现. WCF是根据事务范围里的参与个体来选择事务管理协议的.事务管 ...
- [WCF编程]12.事务:Transaction类
一.概述 .NET2.0在命名空间System.Transactions下提供了Transaction类,它表示所有.NET事务管理器使用的事务. [Serializable]public class ...
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
- 【WCF--初入江湖】01 WCF编程概述
01 WCF编程概述 SOA的优点 1.服务独立于平台和工作环境.服务并不关心自己所处的环境,也不关心与之进行通信的服务所处的 环境. 2.服务相互隔离. 3.服务对协议.格式和传输中立. 4. ...
- SQL Server中的事务日志管理的阶梯,级别1:事务日志概述
SQL Server中的事务日志管理的阶梯,级别1:事务日志概述 翻译:刘琼滨 谢雪妮 许雅莉 赖慧芳 级别1:事务日志概述 事务日志是一个文件,其中SQL服务器存储了所有与日志文件关联的数据库执行的 ...
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
随机推荐
- Mycat 月分片方法
概述 本篇文章主要介绍Mycat以月进行分片的方法,包括配置方法.注意事项等. mycat版本:1.4 数据节点:dn1,dn2,dn3 架构:主从 配置 创建测试表 CREATE TABLE `t ...
- Docker实践:安装wordpress
本文将示例如何使用Docker来安装wordpress.使用三种方法: 1.基于官方的wordpress镜像使用docker run实现: 2.基于官方的wordpress镜像使用fig命令编排工具实 ...
- Github团队开发集成以及eclipse集成
温馨提示:本篇是用于团队开发协作的github,如果是单人的可以移步本系列另外一篇 集成eclipse较为简单 团队仓库目录结构 TestOrgName xxxsystem configs dbscr ...
- BUG级别定义标准
通过图片另存为 或者 放大浏览器倍率 查看.
- Java 的设计模式之一装饰者模式
刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...
- ScriptTask读取SharePoint上的Excel
很多情况下,我们会SharePoint 作为文件共享的Server,有时,业务上需要将SharePoint上的Excel文档 Download 到db中.对于搞DB的人来说,难点是如何下载Excel? ...
- CSS系列:CSS选择器
选择器(selector)是CSS中很重要的概念,所有HTML语言中的标记样式都是通过不同的CSS选择器来控制的.用户只需要通过选择对不同的HTML标签进行选择,并赋予各种样式声明,即可实现各种效果. ...
- Mesh Data Structure in OpenCascade
Mesh Data Structure in OpenCascade eryar@163.com 摘要Abstract:本文对网格数据结构作简要介绍,并结合使用OpenCascade中的数据结构,将网 ...
- TOMCAT开放远程调试端口
方法1. WIN系统,在catalina.bat里: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdw ...
- Hibernate4.0之HibernateSessionFactory源码详解
import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Conf ...

