跳到主内容

Charpter 1 of 《transaction processing》

1

1.9 保存点和部分回滚

SQL的事务模型允许事务的部分提交:在前滚事务中的更新操作中的一个子集可以在不全部丢弃回滚整个事务的情况下回滚。 在执行了部分回滚后,在前滚阶段中余下的事务能够继续进行新的前滚操作。

部分回滚中要回滚的操作是由该事务的最后一次更新操作到上一个设置的保存点。保存点可以通过SQL语句来设置:

set savepoint P

其中P是savepoint的一个独一名称。SQL语句

rollback to savepoint P

可以执行一个部分回滚到保存点P: 事务中在设置P后执行的未被撤销的所有前滚更新操作将会被撤销.

例子1.10 部分回滚可以嵌套

insert into r values (x_1, v_1);
set savepoint P_1;
insert into r values (x_2, v_2);
set savepoint P_2;
insert into r values (x_3, v_3);
rollback to savepoint P_2;
insert into r values (x_4, v_4);
rollback to savepoint P_1;
insert into r values (x_5, v_5);
commit;

语句 rollback to savepoint P2 从关系r中删除刚刚加入的元组(x3, v3)。语句 rollback to savepoint P1 将删除刚刚天添加的(x4, v4)和(x2, v2)。 在事务的结尾, 一个初始空的关系r将只含有元组(x1, v1)和(x5,v5).

我们现在要将部分回滚加入到我们的事务模型中。为了该目的,我们定义了以下操作:

  1. S[P]: set savepoint P.
  2. A[P]: begin partial rollback to savepoint P.
  3. C[P]: complete the partial rollback to savepoint P.

现在,在一个事务的前滚阶段Bα 中, α 可能包含set savepoint操作S[P], 完成的回滚操作 S[P]…A[P]…C[P], 或者一个已初始化但还未完成的部分回滚 S[P]…A[P]… 形式上来说, 一个事务的前滚阶段现在可以是以下三种形式中的任意一种:

(a) 一系列由R、I、D、W和S组成的操作

(b) 形如 \(\alpha S[P]\beta A[P] \beta^{-1}C[P]\gamma\) 的操作序列, 其中α , β 和 γ 是(a)或(b)的形式.

(c) 形如 \(\alpha S[P]\beta \delta A[P] \delta^{-1}\) 的操作序列,

在情形(b)中, 子序列 \(S[P]\beta A[P] \beta^{-1}C[P]\) 表示一个完成的回到保存点P的部分回滚。 在情形(c)中,子序列 \(S[P]\beta \delta A[P] \beta^{-1}\) 表示事务回滚到保存点P.

α 的撤销操作序列,表示为α-1或者undo(α), 是根据它的形式定义的: 对形式(a)中的序列α,它的撤销操作α1和之前的定义一样;对形式(b)中的一个序列,它的撤销操作序列是\(\gamma^{-1}\alpha^{-1}\). 对形式(c)中的序列,它的撤销序列是\(\beta^{-1}C[P]\alpha^{-1}\).

保存点和部分回滚组成了一个重要的数据库编程范式: 事务可以被随意用于立即更新数据库,即使一些接下来的事件强制回滚该更新,之后另一个事件完成该事务。 事实上,对于部分回滚,每个事务可以使用一个提交请求来终止而不需要使用回滚请求(比如说,完全回滚). 完全回滚的效果可以通过一下操作实现:在第一个更新前设置一个保存点,然后在结尾执行一个部分回滚到保存点, 然后提交该事务.

1.10 多粒度

我们可以扩展键范围事务,加入多粒度,因此元组可以被分组到不同关系中。数据库的关系组成一个集合,该集合根据它们的标识符全序排列。该集合可表示为:

$$\{(r_1,R_1),...,(r_{n_i}, R_{n_i})\}$$

其中,ri 是一个在数据库中唯一标识一个关系的标识符,Ri 是关系模式(\(\underline{X_i}V_i\)). 由此,关系r中的元组(x, v)可由(r,x)来唯一标识。

事务模型中的逐元组前滚现在可以定义为:

  1. \(R[r, x, \ge z, v]\): 读取在关系r中第一个满足 \(x\ge z\) 的元组(x,v)
  2. \(R[r, x, \gt z, v]\): 读取在关系r中z的下一个元组(x,v)
  3. \(W[r, x, u, v]\): 更新在关系r中的元组(x,v)
  4. \(I[r, x, v]\): 向关系r中插入元组(x,v)
  5. \(D[r, x, v]\): 在关系r中删除元组(x,v)

新的操作包括:

(a) \(R[r', \theta r, R']\): 阅览关系$r'$中的模式\(R'\)

(b) \(I[r, R]\): 向数据库中创建一个新的关系r(R), 对应于SQL语句 create table r(R) .

(c) \(D[r, R]\): 从数据库中删除一个空的关系r, 对应于SQL语句 drop table r

额外的级别可以被加入到颗粒分级中,通过将关系分成不同数据库(为不同拥有者); 新的操作将包括这些对应于SQL语句 create databasedestroy database.

问题

1.1

文献引用

基于事务的数据库处理是由Eswaran等人1 [1997, 1976] 和Gray等人。部分回滚的事务在Astrahan等人2描述的System R关系数据库管理系统中已经实现。 System R的作者声称一个事务的执行应该是原子性、持久性和一致性的,以及最后一个特性, 描述为:"事务的执行和一次只有事务顺序地执行一样", 被称为隔离性.

Gray3 提出一个用于事务处理的一般形式化模型。 Gray4回顾了事务概念和它的实现方法, 分析平常的"平坦事务"的局限性,主张"嵌套事务"作为建模长久工作流的必要性。在他们关于实现事务处理系统的书中,Gray和Reuter5详尽地分析了事务概念并且回顾了开发事务概念和事务处理系统的历史。

在许多关于数据库管理系统和事务处理的教科书中,最著名的是Papadimitriou6和Bernstein等人7的工作,读写事务模型(1.7节)被采用作为讨论面向事务概念的基本模型。在这个设置中,数据库被看做是未解析的抽象数据项的集合x, 它可被读(通过操作R[x])和写(通过R[x]). Schek等人5提出了一个加强模型:一个丢弃事务的后滚阶段可以被表示为一串撤销操作; 这项特性也被加入到Weikum和Vossen8写的教科书中采用的读写模型(也被称为页模型).

本书以及Sippu和Soisalon-Soininen9等人所采用的键范围事务模型,是受Mohan和Levine用来描述ARIES/KVL和ARIES/IM算法的模型所启发的。 Gray等人考虑的实物模型包含一项特性,一个事务可以在事务终止前声明某个更新为已提交, 尽管这项特征只能被允许运行在最低层的隔离等级.

Footnotes:

1

Kapali P. Eswaran, Jim Gray, Raymond A. Lorie, and Irving L. Traiger. The notions of consistency and predicate locks in a database system. Commun. ACM, 19(11):624–633, 1976.

2

DEFINITION NOT FOUND.

3

DEFINITION NOT FOUND.

4

DEFINITION NOT FOUND.

5

DEFINITION NOT FOUND.

6

DEFINITION NOT FOUND.

7

DEFINITION NOT FOUND.

8

DEFINITION NOT FOUND.

9

DEFINITION NOT FOUND.

注释