首页 理论教育分布式数据库技术中事务的性质及故障恢复机制

分布式数据库技术中事务的性质及故障恢复机制

【摘要】:事务的性质可以用ACID来表示,即原子性、一致性、隔离性和持续性。在这类故障中维持事务原子性的机制称为故障恢复。验证事务是否一致是由语义数据控制实现的。 假设有两个并发事务对用户的银行账户x进行处理,它们都要存取数据项x。

事务管理器(系统)是DBMS中负责调度的相关软件。按照经典数据库理论,有四个重要性质是事务管理器必须关注的。这四个性质用四个字母表示,即ACID。

ACID为四个英语单词的缩写:atomicity(原子性,A)、consistency(一致性,C)、isolation(隔离性,I)、durability(持续性,D)。

原子性(A)与持续性(D)密切相关,一致性(C)与隔离性(I)密切相关。A与D相关,使得事务管理器中有专门的软件模块负责保障,这个软件模块是并发控制(子)系统。C与I相关,使得事务管理器中有专门的软件模块负责保障,这个软件模块就是可靠性(子)系统。这个(子)系统是每个数据库管理系统里必须提供的软件模块。

在数据库管理系统中,会有许多事务同时执行。这些事务应当相互隔离。一个事物的执行不应该影响其他事务的执行。为了保证这一点,DBMS必须使用相应的调度算法

一种调度算法是串行调度(serial scheduling)。在这种调度算法里,事务一个接着一个执行。

事务的性质可以用ACID来表示,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持续性(durability)。这些性质并非完全独立的,而是互相有关联的。

1.原子性

原子性是指把一个事务看成是一个基本的操作单位。因此,要么事务的所有操作都完成,要么什么也没做,这就是称为all-or-nothing的性质。原子性要求事务的执行在出故障时被中断,DBMS负责决定事务如何从故障中恢复。这时,有两个选择可用:让恢复动作继续完成没完成的工作,让系统回退到事务执行前的状态。

故障的种类很多。第一类是事物本身造成的,如输入数据出错、死锁或其他原因。在这类故障中维持事务原子性的机制一般称为事务恢复(transaction recovery)。第二类故障可能起因于系统故障,如介质故障、处理器故障、通信链路故障、电源故障,等等。在这类故障中维持事务原子性的机制称为故障恢复(crash recovery)。两者的区别是后者的结果是易失存储器内信息的丢失。

2.一致性

事务的一致性,简单地说,就是它的正确性。换言之,事务是能够把数据库从一个一致状态转换成另一个一致状态的正确程序。验证事务是否一致是由语义数据控制实现的。保证事务的一致性是靠事务管理来实现的。

要指出的是,下面说到的脏数据(dirty data),是指被一个事务更新后但未提交的数据。我们可以将一致性分成如下等级。

●0级一致性:如果满足以下条件,则事务T看到的是0级一致性:T不会复写其他事务的脏数据。

●1级一致性:如果满足以下条件,则事务T看到的是1级一致性:T不会复写其他事务的脏数据;EOT前,T不提交任何写操作。

●2级一致性:如果满足以下条件,则事务T看到的是2级一致性:T不会复写其他事务的脏数据;EOT前,T不提交任何写操作;T不读其他事务产生的脏数据。

●3级一致性:如果满足以下条件,则事务T看到的是3级一致性:T不会复写其他事务的脏数据;不到所有写操作完成的时候(即不到EOT),T不提交任何写操作;T不读其他事务产生的脏数据;在T完成前,其他事务不弄脏由T读过的数据。

显然,高一级一致性蕴含了所有低一级一致性。系统中可能有的事务满足高一级一致性,有些事务满足低一级一致性。

3.隔离性

隔离性是事务的另一个性质,它要求每个事务始终看到的是一个一致的数据库。换言之,执行中的事务在其提交前不能将自己的操作结果暴露给其他并发事务。

【例8.6】 假设有两个并发事务(T1和T2)对用户的银行账户x进行处理,它们都要存取数据项x。假设在它们执行前x的账面值是5000元。T1要从账上划走200元,T2是要还给这个账户300元。这两个事务程序的步骤如下:

下面是一种它们可能的执行序列。

T1:Read(x)

T1:x←x-200

T1:Wr i te(x)

T1:Commi t

T2:Read(x)

T2:x←x+300

T2:Wr i te(x)

T2:Commi t

显然,这里事务T1和T2是先后相继执行的,T2读到的x值是4800。但是,由于这两个事务是并发的,所以下面执行的序列也是可能的:

T1:Read(x)

T1:x←x-200

T2:Read(x)

T1:Wr i te(x)

T2:x←x+300(www.chuimin.cn)

T2:Wr i te(x)

T1:Commi t

T2:Commi t

此时,事务T 2读到的x值是5000,这是不正确的,因为x已被事务T 1修改成4800了,而且最后T1修改的值又被T2复写了,这个账户凭空多出了200元,这是忌讳的。

通过不让其他事务看到未完成的结果来保证隔离性,所解决的问题称为解决丢失更新问题(lost updates problem)。

从一致性分层结构看,0级一致性除防止更新丢失外,没有其他功能了,因此提供的是很小的隔离性。2级一致性增加了避免级联夭折的功能。3级一致性则提供了全隔离性。

下面使用ANSI SQL2(即SQL-92)标准说明对隔离性级别进行定义。根据ANSI定义,下面是一些不可取的现象。

脏读(dirty read):脏数据指的是一个事务对数据执行了修改操作,但该事务还没有提交,该被修改数据就称为脏数据。如果事务T1修改了一个数据项,在它提交前,这个数据项被另外一个事务T2读取,一旦T1夭折,T2就变成读了一个在数据库中根本不存在的数据,这是不可取的。

不可重复性或模糊读(non-repeatable or fuzzy read):事务T1读一个数据项,另一个事务T2接着修改或删除这个数据项。如果T1试图再次读这个数据项,则它读到的是另外一个值,或者它根本找不到这个数据项。这样一个事务T1两次读同一个数据项返回的却是不同的结果。

幻象(phantom):这种现象出现在下述这种情况,即事务T 1按一个谓词p搜索一个关系,事务T 2插入了一个满足此谓词的元组(如y),T 1读了该元组,但T 2又夭折了,T 1读到的y就是幻象。

根据这些现象,可以将隔离性级别定义如下。

●读未提交(read uncommitted)(事务)的数据:这个层面上的事务操作三种现象都可能出现。

●读已提交(read committed)(事务)的数据:可能出现模糊读与幻象,但不会脏读。

●可重复地读(repeatable read):只可能出现幻象。

●异常可串行化(anomaly serializable):不可能出现幻象。

4.持续性

持续性是指在一个完整事务发生变化前就写入了硬盘,一旦系统崩溃,这个变化就会记住,在系统重启时将之恢复。应当避免不完整事务,以便保证数据库的一致性。为了能够撤销不完整事务所执行的操作,DBMS会维护一个日志文件。对硬盘上的所有操作在将数据写入前都记录在日志文件上。

持续性保证事务一旦提交,其结果就是永久的,不能从数据库中抹去。持续性性质涉及数据库恢复(database recovery)这个问题,就是说任何情况下都要把数据库恢复到能反映提交动作的状态。

与独立的数据库系统比较,一个复制(有副本)数据库是一个分布式数据库,其中相同的数据项有多个副本存放在多个节点上。复制数据库应当如提供ACID保证的无副本环境一样的情况,称为1-copy equivalence。这样ACID可以定义如下。

●copy atomicity:保证一个事务在实施操作的每个副本都有相同的决策,即都提交或都夭折。因此,需要副本间保证强加某种形式的契约协议(agreement protocol)。

●1-copy consistency:在所有执行事务的副本上强加一个结束后不损坏的完整性约束,保证有一个一致的数据库状态。

●1-copy isolation:保证多个副本上执行的一组并发事务等价于一个串行执行,也称1-copy-serializability。

●1-copy durability:保证一旦一个副本出现故障,随后就能恢复,不仅要求重做本地已经提交的事务,还要求做在宕机期间耽误的系统上所有已全局提交的更新。

值得一提的是,ACID的要求面临新的挑战。新的理论出现了,如CAP理论和BASE理论。

1)CAP理论

在分布式数据库系统,尤其是基于Web的系统中,数据在不同的节点有多个副本。为了尽快定位指定数据项的位置,DBA常考虑设置索引。处理索引对关系型数据库管理系统来说很累赘,特别是在数据变化很快时。同时,在关系型数据库系统里,为了响应用户的请求,常常要实施多个表的连接运算,这也是开销很大的。在分布式数据库系统里,为了强制满足ACID,在用户可以访问数据前,必须保证所有数据项在所有节点上都是一样的,需要耗费的时间很多。

近年来,是否放宽对ACID要求的思想开始吸引大家的注意,例如CAP理论(Brewer,2012),试图在竞争点上寻找平衡点。考虑的竞争点就是CAP理论。

●C(consistency):一致性。ACID中的一致性要求是严格的。在CAP理论里,在分布式系统中同一数据项的所有数据备份,在同一时刻是否为同样的值(等同于所有节点访问同一份最新的数据副本)是可以商榷的。

●A(availability):可用性。在计算/存储集群中,一部分节点出现故障后,集群整体是否还能响应客户端的读/写请求。

●P(partition tolerance):分割容忍性。以实际效果而言,网络分割相当于将通信的时限要求破坏了。系统如果不能在时限内达成数据一致性,就意味着发生了分割的情况,必须就当前操作在C和A之间做出选择。

CAP是应NoSQL数据库所面临的态势提出的。CAP理论是在分布式存储环境中,最多只能实现上面的其中两点。进一步说,由于当前的网络硬件肯定会出现延迟丢包等问题,所以分割容忍性是必须实现的。因此我们只能在一致性和可用性之间来权衡,没有一个NoSQL数据库能同时保证C、A、P这三点。

2)BASE理论

BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,BASE是对CAP中一致性和可用性权衡的结果,是基于CAP理论逐步演化而来的,其核心思想是,即使无法做到强一致性(strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(eventual consistency)。

本质上,BASE针对的是大多数NoSQL数据库,面对的是分布式存储环境,就像关系型数据库系统强调ACID一样。