事务可串行化原理

访问并可能更新各种数据项的一个程序执行单元。通常由高级数据库操作语言或编程语言通过 JDBC 或 ODBC 嵌入式数据库访问书写的用户程序的执行所引起的。

【组成】:事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作。

【ACID 特性】:

  • Atomicity:原子性,事务是一个不可分割的工作单位,事务中包括的操作要么都执行,要么都不执行。
  • Consistency:隔离性,隔离执行事务时(即在没有其他事务并发执行时)保持数据库的一致性。
  • Isolation:独立性,多事务执行,系统保证对于任何一对事务 A 与 B 都感知不到对方的存在。
  • Durability:持久性,事务执行成功,对数据库的改变必须是永久的,即使数据库出现故障。

可串行化

如下图所示,T1、T2 的执行顺序称为调度(schedule),它们表示指令在系统中执行的时间顺序。一组事务的一个调度必须包含这一组事务的全部指令,并且必须保持指令在当前事务中出现的顺序。

T1          T2
Read(A);
A = A - 50;
Write(A);
Read(B);
B = B + 50;
Write(B);
            Read(A);
            Temp = A * 0.1;
            A = A - Temp;
            Write(A);
            Read(B);
            B = B + Temp;
            Write(B);

事务 T1 先于 T2(或 T2 先于 T1)执行,则称之为串行调度。n 个事务的事务组,共有 n! 个不同的有效串行调度。

假设 n = 4,T1、T2 和 T3,3!= 6。

T1 T2 T3
T1 T3 T2
T2 T1 T3
T2 T3 T1
T3 T1 T2
T3 T2 T1

若事务只采取串行调度,则其他事务必须等到当前事务结束后运行。事务在执行过程中需要不同的资源,CPU、存取数据库以及 I/O 除操作。如果事务串行执行,则许多系统资源将处于空闲状态。因此,为了充分利用系统资源,应该允许事务并发调度

那么如何判断并发调度是正确的?某个并发调度,当且仅当它是可串行化的,即正确调度可串行化调度又是什么?

可串行化调度

多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行这些事务时的结果相同。可串行化调度能保证并发的事务调度方式既能满足数据一致性需求,又能提高并发事务的执行效率。

【示例】:考虑调度 S,其中两条连续指令 I 和 J,如果 I 与 J 引用不同的数据项,则交换 I 和 J 不影响调度中任何指令的结果。如果 I 和 J 引用相同的数据项 Q,会出现以下四种情景:

  1. I = read(Q) , J = read(Q) 次序不重要,Ti与Tj取值相同
  2. I = read(Q) , J = write(Q) 影响另外的事务读的值
  3. I = write(Q), J = read(Q) 影响另外的事务读的值
  4. I = write(Q), J = write(Q) 下一条read会受影响,即影响的数据库最终值

冲突操作是指不同事务对同一个数据的读写操作和写写操作。判断规则如下:

  • 两个动作属于不同的事务;
  • 至少一个动作是写操作;
  • 动作在操作同一个对象(读同一个对象或写同一个对象)。

上述示例中:非冲突:1,冲突:2、3、4。

【冲突等价(Conflict equivalence)】:对于不同事务调度方式 S1 和 S2,如果满足以下两个条件,则事务调度方式 S1 和 S2 是等价的。

  • S1 和 S2 调度方式包括同样的事务集合(每一个事务中的操作的顺序是固定的,不能在不同的调度方式下发生变化);
  • S1 和 S2 调度方式包括同样的冲突操作集合。

【冲突可串行化】:若调度 S 与一个串行调度等价,则称 S 是冲突可串行化。

例如,A = 100,B = 10。

冲突可串行化示例.png

冲突可串行化调度是可串行化调度的充分条件,换言之,若一个调度是冲突可串行化,则一定是可串行化调度。反过来说,可串行化调度不一定是冲突可串行化。例如看下面这个例子:

【示例】:有三个事务 T1 = W1(A)W1(B),T2 = W2(A)W2(B),T3 = W3(B)。调度 L1 = W1(A)W1(B)W2(A)W2(B)W3(B) 串行调度。调度 L2 见下图。

T1          T2          T3
Write(A);
            Write(A);
            Write(B);
Write(B);
                        Write(B);

调度 L2 不满足冲突可串行化,但满足可串行化调度。

【判断方式】:优先图。若存在环则为非冲突可串行化,不存在环则冲突可串行化。

  • 优先图 G = (V, E),V 是顶点集、E 是边集,顶点集由事务组成,边集表示事务的执行的先后顺序。

上个示例的优先图见下图。

冲突可串行化优先图.png

参考

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页