在一个基于SOA架构的分布式系统体系中,服务(Service)成为了基本的功能提供单元,无论与业务 流程无关的基础功能,还是具体的业务逻辑,均实现在相应的服务之中。服务对外提供统一的接口,服 务之间采用标准的通信方式进行交互,各个单一的服务精又有效的组合、编排成为一个有机的整体。在 这样一个分布式系统中某个活动(Activity)的实现往往需要跨越单个服务的边界,如何协调多个服务 之间的关系使之为活动功能的实现服务,涉及到SOA一个重要的课题:服务协作(Service Coordination )。而具体来讲,一个分布式的活动可能会执行几秒钟,比如银行转帐;也可能执行几分钟、几个小时 、几天甚至更长,比如移民局处理移民的申请。事务,无疑是属于短暂运行服务协作(Short-Running Service Coordination)的范畴。
一、 什么是事务(Transaction)
事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作 只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回 滚。简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。事务具有如 下四个属性,根据其首字母,我们一般将其称为事务的ACID四大属性:
* 原子性(Atomicity):“原子”这个词的本义就是不可分割的意思,事务的原子性的含义是:一 个事务的所有操作被捆绑成一个整体,所有的操作要么全部执行,要么都不执行;
* 一致性(Consistence):事务的原子性确保一个事务不会破环数据的一致性,如果事务成功提交 ,数据的状态是组成事务的所有操作按照事先编排的方式执行的结果,数据状态具有一致性;如果事务 任何一个中间步骤出错,整个事务回滚并将数据回复到原来的状态,数据状态仍然具有一致性。所以, 事务只会将数据状态从一个一致性状态转换到另一个一致性状态;
* 隔离性(Isolation):从事务的外部来看,事务的一致性实现了数据在两个一致性状态之间的转 换,但是从事务内部来看,组成事务的各个操作是按照一定的逻辑顺序执行的,所以数据具有位于两个 一致性状态的“中间状态”。但是,这种中间状态被隔离于事务内部,对于事务外部是不可见的;
* 持久性(Durability):持久性的意思是一旦成功提交,基于持久化资源(比如数据库)的数据将 会被持久化,对数据的改变是永久性的。
事务最初来源于数据库管理系统(DBMS),反映的是对存储于数据库中的数据操作。除了主流的关系 型数据库管理系统,比如SQL Server,Oracle和DB2等提供对事务的支持,基于事务的数据操作方式也可 以应用到其他一些数据存储资源,比如MSMQ。自Windows Vista开始将文件系统(NTFS)以至于注册表纳 入了事务型资源(Transactional Resource)的范畴。
二、 事务的显式控制
虽然事务型资源家族成员越来越多,但是不可否认的是,数据库还是我们使用频率最高的事务型资源 。对于稍微有一定经验的开发人员,应该都在存储过程(Stored Procedure)中编写过基于事务的SQL, 或者编写过基于ADO.NET事务的代码,对事务的进一步介绍就从这里说起。