一、事务概述

维护系统一致性和正确地处理错误恢复挑战的最佳方式是使用事务。

一个事务就是一个复杂操作的集合,这个集合中任何一个操作的失败都会引起整个集合的失败。

尽管在事务进行时系统被允许暂时出于不一致的状态,但是一旦事务结束,系统一定会处于一直的状态。

事务资源

事务编程需要资源(如数据库或消息队列)一起协作,这类资源要能够参与事务并回滚在事务中发生的变化。

一般情况下,我们必须通知这些希望执行事务性工作的资源,这个行为称为在事务中登记资源。一些资源支持自动登记,也就是说它们能够检测到自身是否被事务访问,并完成登记。资源呢一旦被登记,我们就能够对它执行操作。如果没有错误发生,要求提交资源的所有状态发生改变;剐有错误发生,要求回滚资源的状态的所有变化。

在一个事务处理中,不要访问非事务的资源很关键(如文件系统),因为事务一旦被中止,是不会回滚这些非事务资源上的改变。

事务属性

当在面向服务的应用程序中使用事务时,必须遵守四个核心属性,也就是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.事务:事务概述的更多相关文章

  1. [WCF编程]12.事务:服务事务编程(下)

    一.投票与提交 虽然WCF负责事务传播及两阶段提交协议的管理工作,但是 她不知道事务是否应该提交或终止.这需要根服务告诉WCF应该何时启动两阶段提交协议.是提交还是终止.WCF提供了两种编程模式来对事 ...

  2. [WCF编程]12.事务:事务传播

    一.事务传播概述 WCF可以跨越服务边界传递事务.这可以让服务参与到客户端事务里,客户端还可以在同一个事务里调用多个服务.客户端本身不一定是WCF服务.客户端事务是否传播到服务端可以通过绑定和操作契约 ...

  3. [WCF编程]12.事务:服务事务编程(上)

    一.设置环境事务 默认情况下,服务类和操作没有环境事务,即使客户端事务传播到服务端也是如此. 尽管强制事务流从客户端传播过来,但服务端的环境事务依旧为null.为了启用环境事务,每个操作必须告诉WCF ...

  4. [WCF编程]12.事务:事务协议与管理器

    一.事务协议 总体来说,WCF开发人员不需要涉及事务协议与管理器.我们应该依赖WCF来选择相应的事务协议和管理器,重点关注业务逻辑的实现. WCF是根据事务范围里的参与个体来选择事务管理协议的.事务管 ...

  5. [WCF编程]12.事务:Transaction类

    一.概述 .NET2.0在命名空间System.Transactions下提供了Transaction类,它表示所有.NET事务管理器使用的事务. [Serializable]public class ...

  6. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

  7. 【WCF--初入江湖】01 WCF编程概述

    01 WCF编程概述 SOA的优点 1.服务独立于平台和工作环境.服务并不关心自己所处的环境,也不关心与之进行通信的服务所处的    环境. 2.服务相互隔离. 3.服务对协议.格式和传输中立. 4. ...

  8. SQL Server中的事务日志管理的阶梯,级别1:事务日志概述

    SQL Server中的事务日志管理的阶梯,级别1:事务日志概述 翻译:刘琼滨 谢雪妮 许雅莉 赖慧芳 级别1:事务日志概述 事务日志是一个文件,其中SQL服务器存储了所有与日志文件关联的数据库执行的 ...

  9. 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)

    Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...

随机推荐

  1. EF遇到的一些问题

    环境:EntityFramework 版本号:4.1.0.0 问题一:“数据读取器与指定的“.......”不兼容.某个类型为“...”的成员在同名的数据读取器中没有对应的列.”. 使用方式:rep. ...

  2. 用rem实现WebApp自适应的优劣分析

    关于rem实现屏幕自适应布局的讨论还是比较多的,刚好我也看到使用rem实现自适应的web app,所以也来凑下热闹. 说起rem,免不了要联系到em.px,这里简单提提他们的定义和特点. 1. px: ...

  3. Atitit 分区后的查询  mysql分区记录的流程与原理

    Atitit 分区后的查询  mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...

  4. iOS---iOS9搜索功能

    前言 在iOS9之前我们只能使用Spotlight来搜索应用名称来打开指定App,而其他的内容都是提供给系统使用(信息,联系人,邮件等).在iOS9以后Apple允许开发者设置应用中任意内容可以被Sp ...

  5. webservice返回值为Map类型的处理方法

    在写一个webservice的时候,方法的返回值是一个复杂类型,处理方法是写一个结果类(Javabean)作为返回值.想着webservice方法返回值为Map的没写过,然后就试着写了一个简单的Dem ...

  6. PHP的性能演进(从PHP5.0到PHP7.1的性能全评测)

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  7. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  8. Windows phone重写返回键

    protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) {//需要设置这个属性 e.Cancel ...

  9. Oracle_多表查询

    SQL多表查询 等值和不等值连接查询 从多个表中获取数据:如果在查询的时候,直接从多个表中获取数据.没有添加条件判断,会出现"笛卡尔积"错误 笛卡尔积错误 笛卡尔集会在下面条件下产 ...

  10. MySQL学习笔记十七:复制特性

    一.MySQL的复制是将主数据库(master)的数据复制到从(slave)数据库上,专业一点讲就是将主数据库DDL和DML操作的二进制日志传到从库上,然后从库对这些二进制日志进行重做,使得主数据库与 ...