在教材中,表示调度的方式主要是将来自不同事务的操作按其发生的时间顺序线性地排列出来。每个操作都明确指出了:
- 执行该操作的事务 ID:通常用数字下标表示,如 T1, T2。
- 操作类型:例如读(r)、写(w)。在讨论并发控制时,还包括锁操作,如加锁(l,可以是共享锁 S 或排他锁 X)和解锁(u)。
- 操作所针对的数据项:例如 A, B, C。
将这些信息组合起来,形成一个操作序列。例如,r1(A)
表示事务 T1 读取数据项 A,w2(B)
表示事务 T2 写入数据项 B,l_X1(A)
表示事务 T1 对数据项 A 加排他锁。
所以,不同的调度写法实际上是这些操作符号按时间顺序的不同组合排列。
以下是教材中展示的几种调度表示示例:
- 作为操作序列的线性表示:直接列出操作的顺序。
- 例如 [9] 中的
Sc = r1(A) w1(A) r2(A) w2(A) r1(B) w1(B) r2(B) w2(B)
- 例如 [11] 中的
Sd = r1(A) w1(A) r2(A) w2(A) r2(B) w2(B) r1(B) w1(B)
- 例如 [9] 中的
- 在表格中按事务列出,但整体构成一个线性序列:为了更清晰地展示来自不同事务的操作如何交错执行,有时会将调度写成多列(每列代表一个事务)的形式,但阅读顺序仍然是按时间从上到下、从左到右的线性顺序 [4, 5, 6, 7, 8]。
- 例如 [4] 中的 Schedule A:
这个表格表示的线性调度是:T1 T2 Read(A); A <- A+100; Write(A); Read(B); B <- B+100; Write(B); Read(A); A <- A*2; Write(A); Read(B); B <- B*2; Write(B);
r1(A), w1(A), r1(B), w1(B), r2(A), w2(A), r2(B), w2(B)
(如果忽略事务内部的计算细节,只关注读写操作)。
- 例如 [4] 中的 Schedule A:
- 包含锁操作的线性表示:当讨论带有锁协议的调度时,操作序列中会包含锁操作。
- 例如 [34] 中的 Schedule F:
l1(A); Read(A); A A+100; Write(A); u1(A); l2(A); Read(A); A Ax2; Write(A); u2(A); ...
(同样包含了部分操作的逻辑描述)
- 例如 [34] 中的 Schedule F:
总之,在数据库理论中,调度的基本写法或表示方法是通过一个时间顺序的操作序列来描述事务的交错执行,每个操作都带有执行它的事务 ID 和操作的具体内容(读、写、加锁、解锁等)以及数据项。不同的“写法”更多是指这些序列的不同具体内容(哪些操作、来自哪些事务)以及为了清晰展示交错执行而采用的表格排版方式。