操作流程
设想网上购物的一次交易,其付款过程起码包含下方几步报告库操作:
· 更新客户所购商品的库存信息
· 保存客户付款信息--或许包含与银行系统的交互
· 生成订单而且保存到报告库中
· 更新用户有关信息,比如购物数量等等
正常的情形下,这些操作将顺遂执行,最终交易成功,与交易有关的所有报告库信息也成功地更新。但是,假使在这一连串过程中任何一个环节出了差错,比如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,全会致使交易失利。一旦交易失利,报告库中所有信息都务必维持交易前的状态不变,比如最后一步更新用户信息时失利而致使交易失利,那么务必保证这笔失利的交易不影响报告库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,报告库的信息将令一片混乱而不可预期。
报告库事务正是用来保证该种情形下交易的稳定性和可预期性的技术。报告库事务的ACID属性
原子性
(atomic)
事必须须是原子工作单元;对于其报告修改,要么全都实施,要么全都不实施。一般,与某个事务相关的操作具有共同的目标,而且是相互依靠的。假使系统只实施这些操作的一个子集,则或许会损坏事务的总的目标。原子性清除了系统处理操作子集的机会性。
统一性
(consistent)
事务在完成时,务必使所有的报告都维持统一状态。在有关报告库中,所有规则都务必应用于事务的修改,以维持所有报告的完整性。事务终结时,所有的内部报告结构(如 B 树索引或双向链表)都务必是正确的。某些维护统一性的责任由应用程序开发人士承受,他们务必保证应用程序已强制所有已知的完整性约束。比如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。
隔离性
(insulation)
由并发事务所作的修改务必与任何其它并发事务所作的修改隔离。事务查看报告时报告所处的状态,要么是另一并发事务修改它以前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的报告。这称为可串行性,由于它能够从新装载起始报告,而且重播一连串事务,以使报告终结时的状态与原始事务实施的状态相同。当事务可序列化时将得到最高的隔离级别。在此级别上,从一组可并行实施的事务得到的结果与通过接连运行每个事务所得到的结果相同。受于高度隔离会制约可并行实施的事务数,所以一部分应用程序减弱隔离级别以换取更大的吞吐量。
持久性
(Duration)
事务完成之后,它对于系统的影响是永久性的。该修改即便显现致命的系统故障也将一直维持。DBMS的责任
企业级的报告库管理系统(DBMS)都有责任供应一种保证事务的物理完整性的机制。就常用的SQL Server2000系统来说,它具备锁定设备隔离事务、记录设备保证事务持久性等机制。所以,我们不必关心报告库事务的物理完整性,而应当关注在什么情形下运用报告库事务、事务对性能的影响,如何运用事务等等。
本文将涉及到在.net框架下运用C#语言操纵报告库事务的方方面面。
体验SQL语言的事务机制
作为大型的企业级报告库,SQL Server2000对事务给予了很好的支持。我们可以运用SQL语句来定义、提交以及回滚一个事务。
如下所示的SQL代码定义了一个事务,而且命名叫"MyTransaction"(限于篇幅,本文并没有讨论如何编撰SQL语言程序,请读者自行参考有关书籍):SQL 事务处理模型
事务有三种模型:
1.隐式事务是指每一条报告操作语句都自动地形成一个事物,每个事务都有显式的开始和终结标记。
2.显式事务是指有显式的开始和终结标记的事物,事务的开始是隐式的,事务的终结有清晰的标记。
3.自动事务是系统自动默认的,开始和终结不用标记
并发控制
1. 报告库系统一个显著的特点是多个用户共享报告库资源,特别是多个用户可以同期存取相同报告。
串行控制:假使事务是顺序实施的,即一个事务完成之后,再开始其他事务
并行控制:假使DBMS可以同期接受多个事务,而且这些事务在时间上可以重叠实施。
2.并发控制简述
事务是并发控制的基本单位,保证事务ACID的特性是事务处理的重要任务,而并发操作有机会会损坏其ACID特性。
DBMS并发控制机制的责任:
对并发操作执行正确调度,保证事务的隔离性更一般,保证报告库的统一性。
假使没有锁定且多个用户同期访问一个报告库,则当他们的事务同期运用相同的报告时或许会发生困难。受于并发操作导致的报告不统一性包含:丢失报告修改、读”脏”报告(脏读)、不可重复读、造成幽灵报告。
(1)丢失报告修改
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新困难。每个事务都不晓得其它事务的存在。最后的更新将重写由其它事务所做的更新,这会致使报告丢失。如上例。
再比如,两个编辑人士制作了同一文档的电子复本。每个编辑人士独立地更改其复本,然后保存更改后的复本,如此就覆盖了原始文档。最后保存其更改复本的编辑人士覆盖了第一个编辑人士所做的更改。假使在第一个编辑人士完成之后第二个编辑人士才可执行更改,则可以避免该困难。
(2)读“脏”报告(脏读)
读“脏”报告是指事务T1修改某一报告,并将其写回磁盘,事务T2读取同一报告后,T1受于某种原因被除撤销,而此时T1把已修改过的报告又复苏原值,T2读到的报告与报告库的报告不统一,则T2读到的报告就为“脏”报告,即不正确的报告。
比如:一个编辑人士正在更改电子文档。在更改过程中,其他编辑人士复制了该文档(该复本包含到迄今为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人士觉得当前所做的更改是错误的,于是删除了所做的编辑并保存了文档。分发给用户的文档包含不再存在的编辑内容,而且这些编辑内容应觉得从未存在过。假使在第一个编辑人士确定最终更改前任何人都不能读取更改的文档,则可以避免该困难。
( 3)不可重复读
指事务T1读取报告后,事务T2实施更新操作,使T1无法读取前一次结果。不可重复读包含三种情形:
事务T1读取某一报告后,T2对其做了修改,当T1又一次读此数据后,得到与前一不同的值。
(4)造成幽灵报告
按一定条件从报告库中读取了某些记录后,T2删除了其中部分记录,当T1又一次按相同条件读取报告时,发现某些记录消失
T1按一定条件从报告库中读取某些报告记录后,T2插入了一部分记录,当T1又一次按相同条件读取报告时,发现多了一部分记录。