资源描述
张名杨 顾敏 董楚楚 王淼
什么是数据库事务
数据库事务是指作为单个逻辑工作单元执行的一系列操作。
“一荣俱荣,一损俱损”这句话很能体现事务的思想,很多复杂的事物要分步进行,但它们组成一个整体,要么整体生效,要么整体失效。这种思想反映到数据库上,就是多个SQL语句,要么所有执行成功,要么所有执行失败。
数据库事务有严格的定义,它必须同时满足四个特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabiliy),简称为ACID。
事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性:
· 原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
· 一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。
· 隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
· 持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:
· 更新客户所购商品的库存信息
· 保存客户付款信息--可能包括与银行系统的交互
· 生成订单并且保存到数据库中
· 更新用户相关信息,例如购物数量等等
正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。
数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。
在这些事务特性中,数据“一致性”是最终目标,其它的特性都是为达到这个目标的措施、要求或手段。
数据库管理系统一般采用重执行日志保证原子性、一致性和持久性,重执行日志记录了数据库变化的每一个动作,数据库在一个事务中执行一部分操作后发生错误退出,数据库即可以根据重执行日志撤销已经执行的操作。此外,对于已经提交的事务,即使数据库崩溃,在重启数据库时也能够根据日志对尚未持久化的数据进行相应的重执行操作。
和Java程序采用对象锁机制进行线程同步类似,数据库管理系统采用数据库锁机制保证事务的隔离性。当多个事务试图对相同的数据进行操作时,只有持有锁的事务才能操作数据,直到前一个事务完成后,后面的事务才有机会对数据进行操作。Oracle数据库还使用了数据版本的机制,在回滚段为数据的每个变化都保存一个版本,使数据的更改不影响数据的读取。
DBMS的责任和我们的任务
企业级的数据库管理系统(DBMS)都有责任提供一种保证事务的物理完整性的机制。就常用的SQL Server2000系统而言,它具备锁定设备隔离事务、记录设备保证事务持久性等机制。因此,我们不必关心数据库事务的物理完整性,而应该关注在什么情况下使用数据库事务、事务对性能的影响,如何使用事务等等。
本文将涉及到在.net框架下使用C#语言操纵数据库事务的各个方面。
事务处理系统是对组织中的基本业务活动进行记录、文档化、修改、归纳等处理的信息系统,将企业的基本业务活动处理过程计算机化,自动对组织中的日常事务活动进行记录,传送,分类,统计,汇总,修改数据库或输出事务记录等处理。
作用:它向组织的管理信息系统、决策支持系统和其他信息系统及管理工作提供所需要的数据。
实时事务的特征
1 .定时性
实时应用中事务的定时性来源于两方面:一是外部环境显式给出的反应时间要求,如截止期等;二是由于系统中的数据随时间变化而转嫁来的。
定时性包括了两方面的含义:
定时限制事务的执行具有显式的时限,如期限、截止时间等。这是由于控制系统要随时紧紧地跟踪被控系统而引起的,它要求RTDB 必须有时间处理机构。时限还可有软硬之分。
定时正确性事务能按合适的时间要求正确执行。这是由于要求数据对于控制系统的各种决策活动随时有效而引起的,它要求权衡定时限制与数据一致性等多方面因素,提供合适的调度算法。
实时事务有不同的定时限制,其中最重要的有:
截止时间实时事务完成的最后期限。它可以有硬、软之分,具有硬截止时间的事务(称为硬实时事务),必须在其截止时间以前完成,否则将带来灾难性的后果,故到达其截止时间还不能完成的硬实时事务必须夭折。具有软截止时间的事务(称为软实时事务),应该在其截止期完成,但超过其截止时间也还有一定意义(尽管不断下降),故软实时事务到达其截止时间后不必立即夭折它。
到达时间事务在系统中生成的时间。它可以是可预报的,也可以是不可预报的。可预报的到达时间可显式地给出或者作为一个导出函数,如周期事务的到达时间是可预报的。不可预报的到达时间是指当相应事务到达系统时才能知道,非周期事务的到达时间就是不可预报的。
期望执行时间估算的最坏情况执行时间。由于各种不可预报性因素,它很难做到准确,估算的最坏情况执行时间可能与实际情况相差很大。然而,为了合理地得到事务的截止时间及适当地调度以使其满足,又必须事先较准确地估算其执行时间。
2 .语义相关性
实时数据库事务之间存在着各种关系,包括结构关系、数据与通信关系、时间关系等,这些关系带来了事务间的各种相关性。
(1) 结构相关
它来自于复杂事务模型的结构特征,用来建模复杂事务内部并发事务行为的一种约束。不同的复杂事务模型有不同的结构相关性,但它们可以通过事务间的" 执行依赖性" 来定义,实时嵌套事务中基本的事务依赖有:
* 子事务对父事务的开始依赖(BD):子事务开始前父事务已经开始;
* 父事务对子事务的提交依赖(CD):父事务提交前子事务已经结束(提交或夭折);
* 子事务对父事务的夭折依赖(AD):父事务夭折则子事务一定夭折。
(2) 数据相关
数据相关就是不同事务间的共享数据联系,但此" 共享" 概念比传统的具有更广的意义:实时嵌套事务中的子事务共享父事务数据,子事务提交时其对数据库的更改委托给父事务,只有父事务提交时才能真正地写入数据库。
(3) 功能替代/ 结果补偿
一个实时应用常常由若干任务组成,而一个任务有时可以通过不同途径来实现。一个应用建模为一个事务,一个任务则建模为一组功能等价的子事务,称为该任务的替代集。若一个任务的替代集中的子事务之一能成功执行,则该任务是可完成的。若对应一个事务的所有任务可完成,则该事务是成功的(可提交)。功能替代导致了事务执行路径的不确定性,即一个事务成功执行的路径依赖于执行过程中(子事务)失败的发生,且即使某些子事务失败了,事务仍可能顺利提交。这还体现了实时事务的健壮性,即有的事务(任务)不能失败。
由于前面所述的事务的结构复杂性和功能替代性,因此,事务的执行经历不确定,一个子事务的执行直到提交时还不能确定它是否需要。若一个(子)事务提交后,发现它是不需要的,该怎么办?另一方面,一个实时事务可以物理改变现实世界的状态,换句话说,事务可以启动各种活动,这些活动在它提交前就已经影响了现实世界,因而当这种事务夭折时,不能进行传统意义下的" 还原"(Undo)。于是需要一种" 补偿" 活动来抵消它所有的影响,这种补偿活动也是事务。对于一个(子)事务,若存在能抵消它提交后所产生的所有影响的(子)事务,则称其为是可补偿的,否则是不可补偿的。当然,不是每一个(子)事务都是可补偿的,不可补偿的(子)事务在知道它确实是需要的以前,一定不能提交。
实时事务处理
1 .实时事务优先级分配
实时事务的调度和并发控制都是基于事务的优先级进行的,因此,如何分配事务的优先级是一个重要的问题。
常见的事务优先级分配算法有以下几种:
最早放行最优先(Earliest Release First)该策略将最高优先级指派给具有最早" 放行"(Release)时间的事务。所谓放行时间就是事务可以开始执行的最早时间,与此相联的有事务到达(Arrive)时间、事务接纳(Admission)时间。
截止期最早最优先(Earliest Deadline First)即具有最早截止期者优先级最高。
空余时间最短最优先(Least Slack First)事务t 的空余时间S=d -(τ+E -P),即推迟T 的执行而仍然满足其截止期的可推迟时间量估算。
价值最高最优先(Highest Value First)每一事务都有一价值函数,其值最大者最优先。问题是如何合理地构造价值函数
即事务完成时的期望价值与实现该价值所需计算量的比最大者优先级最高。显然,对于期望价值一样的事务,该策略偏向较短者,因为它每单位消耗时间所获得的价值更大。与上面的HVF 策略一样,这里也有如何设计价值函数的问题。
2 .实时事务并发控制和调度
在实时应用环境中,如果处理不当,可能造成" 优先级颠倒",即优先级高的事务等待优先级低的事务,这对实现事务的定时限制是不利的。为此,我们提出了以下几种改进方案:
(1) 优先级继承
优先级继承的基本思想是:当发生优先级颠倒时,将占有者tH 的优先级提高到与tR 的一样(即继承tR 的优先级),tH 继续执行直到结束(提交或夭折)。在tH 因某种原因(如成为死锁的牺牲者)而重启动时,它恢复原来的优先级。让tH 继承tR 优先级是为了让它尽快完成,因为tH 的进展也意味着tR 的进展。这种策略称为优先继承(PI)。
(2) 高优先级夭折
这种策略的思想是,当发生优先级颠倒时,夭折低优先级的tH 而让高优先级的tR 执行。该策略称" 高优先" 法(HP)。
展开阅读全文