先决条件 – 并发控制 – DBMS 中的介绍、冲突可串行化、事务隔离级别
可串行化:如果任何事务(非串行)产生的结果等于该调度事务串行执行的结果,那么我们可以将该事务调度称为可串行化调度。
请注意,可串行化的主要目标是找到允许事务在不受干扰的情况下并发执行并产生可由串行执行产生的数据库状态的非串行调度。这些是以下类型的时间表:
- 串行时间表
- 冲突可串行化
- 查看可序列化性
- 非连续时间表
查看可序列化 –
一个调度被称为View Serilizabale ,如果它的视图等同于一个串行调度(不允许重叠事务)。这些是成为视图可序列化性的以下条件:
- 在调度中读取数据项的初始值和写入数据项的最终值的事务必须相同。
- W->R 冲突在两个时间表中必须相同。
现在,让我们考虑以下示例。
示例:假设有两个调度,一个是非串行调度,另一个是串行调度。
Schedule 1 Schedule 2
-------------- ---------------
T1 T2 T1 T2
-------------- ---------------
r1(A) r1(A)
A=A+10 A=A+10
w1(A) w1(A)
r1(B) r2(A)
B=B*10 A=A+10
w1(B) w2(a)
r2(A) r1(B)
A=A+10 B=B*10
w2(A) w2(B)
r2(B) r2(B)
B=B*10 B=B*10
w2(B) w2(B)
检查视图可序列化与否:
Comparison Table
---------------------------
Schedule 1 Schedule 2
---------------------------
A T1 T2 T1 T2
B T1 T2 T1 T2
所以附表 2 相当于附表 1。
当交易数量超过 2 时使用测谎仪:
假设我们有 3 个事务 T1、T2 和 T3。这些交易的可能组合是:
--------------
T1 T2 T3
T1 T3 T2
T2 T1 T3
T2 T3 T1
T3 T1 T2
T3 T2 T1
--------------
1. 一个Tn在一个schedule中读取一个初始数据,同一个Tn也应该读取其中一个事务组合中的初始数据。这意味着 T1 应该在 T2 之前发生,所以我们必须删除这些组合:
--------------
T2 T1 T3
T2 T3 T1
T3 T2 T1
--------------
2.一个Tn在另一个Tn写入一个调度后读取一个数据,同一个Tn也应该在另一个Tn写入一个事务组合后读取。
3.一个Tn在一个schedule中写入一个数据的最终值,同一个Tn也应该将最终数据写入其中一个事务组合中。这意味着 T2 发生在 T3 之前,因此我们必须删除这些组合:
--------------
T1 T3 T2
T3 T1 T2
T3 T2 T1
--------------
例子:
Schedule = w3(x),r2(x),w2(y),r1(z),w3(y),w1(y)
T1 T2 T3
----------------
w(x)
r2(x)
w2(y)
r1(z)
w3(y)
w1(y)
----------------
这里T3必须先出现,虽然实际上没有关系,因为没有其他人写X,我们会在第一步中保留所有可能的交易组合。
T1 必须出现在 T3 之后,因为 T1 在 T3 写入 Z 之后读取 Z。所以在这里我们删除了 T1 在 T3 之前的这三种交易组合。
Available combination:
T2 T3 T1
T3 T1 T2
T3 T2 T1
如果不是 T3,则 T2 必须最后发生,否则 T2 将覆盖 T1 在我们的计划中写入的 y,因此我们从可用组合中删除 T1 未最后发生的情况。
Available combination:
T2 T3 T1
T3 T2 T1
请注意,当在任何事务中都可以进行盲写时,我们会使用 Polygraph。