概述
一个事务是对数据库进行读和写的一个序列。传统数据库(RDB)中事务有两个明显的特性:原子性和可串行性。原子性意指事务中的读和写操作可看作是对数据库的单个原子操作。可串行性意指多个事务并发执行的效果与一次执行这些事务中的一个的效果相同。因而事务管理的任务就是保证事务的原子性和可串行性,它由两部分组成:并发控制和恢复。并发控制涉及到多个事务对数据库的某个公共部分进行同时存取的自动控制。恢复则涉及到将数据库恢复到事务故障之前业已存在的状态。1
事务管理的构成事务处理系统由事务管理器、恢复管理器、锁管理器、死锁管理器、缓存管理器构成。
事务管理器事务管理器负责产生事务并为其分配事务标识,那么它应该可以根据需要产生足够多的子事务并分配足够多的事务标识。当子事务提交时,事务管理器需要知道其父事务标识并执行一系列操作,那么,如果能从子事务标识中直接得到其父事务标识,将大大提高事务处理的效率。
恢复管理器在嵌套事务模型中,子事务相对于父事务及兄弟事务来说,能独立地提交,子事务的卷回也不会导致父事务及兄弟事务的卷回。如果任何一级上的(子)事务回退,则它的所有子事务均回退,不管它们是否实施了局部的提交。因此,子事务提交时,恢复管理器需要将它的日志链接到父事务的日志上,这就要求恢复管理器知道父事务标识。那么,如果能从子事务标识中直接得到其父事务标识,将大大提高恢复管理器的工作效率。
锁管理器在嵌套事务模型中,子事务一旦提交,父事务就可观察到它作出的所有改变。父事务在子事务开始前作出的改变对子事务是可见的。子事务并发运行时,变化不向兄弟事务显示;否则,子事务一旦提交,其变化向兄弟事务显示。因此,子事务提交时,它将拥有的锁转交给父事务。当事务申请锁时,锁管理器负责判断锁的相容性:如果相容,则分配给事务相应的锁;否则,判断申请锁的事务是否是拥有锁的事务的后代,若是则可以为其分配相应的锁,否则不能满足它的申请要求。那么,如果能从两个事务的标识上直接判断出它们之间是否具有祖先一后代关系,将大大提高锁管理器的工作效率。
死锁管理器新型应用要求允许事务结构中最大程度的并行性,包括兄弟事务之间的并行和父子事务之间的并行。这些导致了事务之间等待关系的多样化,并进一步引起死锁类型的多样化,这无疑增加了死锁检测的难度。为了提高死锁检测的效率,尽早发现“隐藏”的死锁,首先必须有效地表示各种等待关系。在嵌套事务模型下,死锁管理器主要处理三种等待关系 :
(1)申请锁的事务等待拥有锁的事务;
(2)父事务等待所有子事务的提交;
(3)申请锁的事务等待拥有锁的事务的满足下列条件的最高层的祖先:它不是申请锁的事务的祖先。
第三种等待关系的有效表示能够避免大量无意义的工作,但这需要找出两个事务的最高层的非共同祖先。为了达到目的,需要对事务层次结构进行不断的向上搜索和比较,这是一项开销很大的工作。那么,如果能从两个事务的标识上直接找出它们的最高层的非共同祖先,将避免一项开销很大的工作,从而大大提高死锁管理器的工作效率。
缓存管理器基于对缓存有效使用的考虑,缓存管理器要求事务标识的存储结构能够对短标识和长标识提供灵活有效的支持,显而易见,静态结构是不合适的,需要使用灵活的动态结构。
总而言之,事务处理对事务标识的需求是:
(1)可以直接从子事务的标识得到其父事务的标识;
(2)事务标识对事务层次结构的宽度和广度提供良好的支持(即:对宽度和广度没有限制);
(3)事务标识存储结构能够提供足够多的事务标识(即:对事务标识的数目没有限制);
(4)根据事务标识可以判断两个事务是否具有祖先一后代关系;
(5)根据事务标识可以找出两个事务的最高层的非共同祖先;
(6)事务标识存储结构应该灵活、长度可变,能够充分利用存储空间有效地存储长标识和短标识。2