事务模型:
事务最基本的特性之一是隔离性。然而当数据库中有多个事务并发执行时,事务的隔离性不一定能保持。为了保证事务的隔离性,系统需要对并发事务之间的相互作用加以控制;这些控制是通过一系列机制中的一个称为并发控制的机制来实现的。最常用的机制是两阶段封锁和快照隔离。
确保隔离性的方法之一是要求对数据项以互斥的方式进行访问,即当一个事务访问某个数据项时,其它任何事务不能修改数据该数据项。—— 可通过只允许事务访问当前该事务持有锁的数据项。
一个事务可以封锁其访问的数据项,而不用封锁整个数据库。在这种策略下,事务必须在足够长的时间内持有锁来保证可串行化,但又要足够的短致使其不会过度影响性能。
目前常用的有共享锁和排他锁两种。我们会要求每个事务根据其对数据项进行的操作类型申请适当的锁。事务通过将请求发送给并发控制管理器,然后只有在得到并发控制管理器的授权(grant)所需锁后才能继续其操作。
该协议要求每个事务分两个阶段提出加锁和解锁申请。
1、增长阶段(growing phase):事务可以获得锁,但不能释放锁。
2、缩减阶段(shrinking phase):事务可以释放锁,但不能获得新锁。
对于任何事务,在调度中该事务获得其最后加锁的位置(growing phase结束点)称为该事务的封锁点(lock point)。这样,多个事务根据其封锁点进行排序,该顺序是事务的一个可串行化顺序。
解决一个数据项作为同步执行的单元。该方法是将多个数据项聚为一组,将它们作为一个同步单元。
以上的协议中,每一对冲突事务的次序都是在执行时由二者都申请,但类型不相容的第一个锁决定的。另一个决定事务可串行化次序的方法是事先选定事务的次序。其中最常见的方法是时间戳排序机制。
有效性检查协议要求每个事务T在其生命周期中按两个或三个阶段执行,这取决于事务是一个只读事务还是一个更新事务。阶段顺序如下:
读阶段(read phase):在这一阶段中,系统执行事务T。各数据项值被读入并保存在事务T的局部变量中。所有的write操作都是对局部临时变量进行的,并不对数据库进行真正的更新。
有效性检查阶段(validation phase):对事务T进行有效性检查测试。判定是否可以执行write操作而不违反可串行性。如果事务有效性测试失败,则系统终止这个事务。
写阶段(write phase):若事务T已通过有效性检查(上面一步),则保存T任何写操作的临时局部变量值被复制到数据库中。只读事务忽略该阶段。
每个事务必须按以上顺序经历这些阶段。然而,并发执行的事务的三个阶段可以交叉执行。
为了进行有效性监测,我们需要知道事务T的各个阶段何时进行。为此,我们需要三个时间戳和事务T关联。
Start(T):事务T开始执行的时间
Validation(T):事务T完成读阶段并开始其有效性检查的时间
Finish(T):事务T完成写阶段的时间。