数据库 -- 事务管理

简介

事务成功完成定义:

事务模型:

  • 活动的(active):初始状态,事务执行时处于这个状态
  • 部分提交的(partially committed): 最后一条语句执行后。
    (此时虽然事务已经完全执行,但是由于实际输出可能仍驻留在主存中,因此一个硬件故障可能阻止其成功完成,因此事务仍可能不得不中止。接着数据库向磁盘里写入足够信息,确保即使出现故障时(假设故障不会引起磁盘上的数据丢失)事务所做的更新也能在系统重启后重新创建。当最后一个信息写完后,事务进入提交状态)
  • 失败的(failed):发现正常的执行不能继续后(如硬件或逻辑错误)。
  • 中止的(aborted):事务回滚并且数据库已恢复到事务开始执行前的状态后。
    (进入失败状态的事务必须回滚,由此,事务进入中止状态)
    此刻,系统有两种选择:a. 对于由于硬件引起的事务中止,可以采取重启事务;b.对于由于事务内部逻辑引起的错误,可以杀死事务。
  • 提交的(committed):成功完成后。

事务的隔离级别

  • 读未提交(read uncommitted)
    会有脏读问题,一个事务中还没有提交的内容被其它事务看到
  • 读已提交(read committed)
    会有不可重复读问题。事务a读取数据后,事务b对该数据进行了修改。事务a再次读取该数据时,数据变了(因为事务只能读取已经提交的事务所做的修改)
  • 可重复读(repeated read)
    会有幻读问题。事务a读取某个范围的数时,事务b在这个范围内新插了一条数据。事务a再去读,数据变了。
  • 可串行化(seriabizable)
    通常保证可串行化调度。但有些数据库系统对该隔离级别的实现在某些情况下允许非可串行化执行。

事务隔离级别的实现 – 并发控制机制

概念

事务最基本的特性之一是隔离性。然而当数据库中有多个事务并发执行时,事务的隔离性不一定能保持。为了保证事务的隔离性,系统需要对并发事务之间的相互作用加以控制;这些控制是通过一系列机制中的一个称为并发控制的机制来实现的。最常用的机制是两阶段封锁和快照隔离。

基于锁的协议

确保隔离性的方法之一是要求对数据项以互斥的方式进行访问,即当一个事务访问某个数据项时,其它任何事务不能修改数据该数据项。—— 可通过只允许事务访问当前该事务持有锁的数据项。
一个事务可以封锁其访问的数据项,而不用封锁整个数据库。在这种策略下,事务必须在足够长的时间内持有锁来保证可串行化,但又要足够的短致使其不会过度影响性能。
目前常用的有共享锁和排他锁两种。我们会要求每个事务根据其对数据项进行的操作类型申请适当的锁。事务通过将请求发送给并发控制管理器,然后只有在得到并发控制管理器的授权(grant)所需锁后才能继续其操作。

两阶段封锁协议

该协议要求每个事务分两个阶段提出加锁和解锁申请。
1、增长阶段(growing phase):事务可以获得锁,但不能释放锁。
2、缩减阶段(shrinking phase):事务可以释放锁,但不能获得新锁。
对于任何事务,在调度中该事务获得其最后加锁的位置(growing phase结束点)称为该事务的封锁点(lock point)。这样,多个事务根据其封锁点进行排序,该顺序是事务的一个可串行化顺序。

多粒度(granularity)

解决一个数据项作为同步执行的单元。该方法是将多个数据项聚为一组,将它们作为一个同步单元。

基于时间戳的协议

以上的协议中,每一对冲突事务的次序都是在执行时由二者都申请,但类型不相容的第一个锁决定的。另一个决定事务可串行化次序的方法是事先选定事务的次序。其中最常见的方法是时间戳排序机制。

基于有效性检查的协议

有效性检查协议要求每个事务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完成写阶段的时间。

多版本机制

快照隔离