调度:
调度室数据库的一个或者多个事物按时间排序的序列
T1 | T2 |
READ(A,t) | READ(A,s) |
t := t + 100 | s := s*2 |
WRITE(A,t) | WRITE(A,s) |
READ(B,t) | READ(B,s) |
t := t + 100 | s := s*2 |
WRTIE(B,t) | WRITE(B,s) |
串行化调度:
串行化是指调度的动作先是一个事物的所有动作,然后是另一个事物的所有动作
T1 | T2 | A | B |
|
| 25 | 25 |
READ(A,t) |
|
|
|
t := t + 100 |
|
|
|
WRITE(A,t) |
| 125 |
|
READ(B,t) |
|
|
|
t := t + 100 |
|
|
|
WRTIE(B,t) |
|
| 125 |
| READ(A,s) |
|
|
| s := s*2 |
|
|
| WRITE(A,s) | 250 |
|
| READ(B,s) |
|
|
| s := s*2 |
|
|
| WRITE(B,s) |
| 250 |
可串行化:
对于一个事物集《1,2,3....》,如果一个并发调度的结果于一个串行化调度的结果一样,就成这个调度是可串行化调度
T1 | T2 | A | B |
|
| 25 | 25 |
READ(A,t) |
|
|
|
t := t + 100 |
|
|
|
WRITE(A,t) |
| 125 |
|
| READ(A,s) |
|
|
| s := s*2 |
|
|
| WRITE(A,s) | 250 |
|
| READ(B,s) |
|
|
| s := s*2 |
|
|
| WRITE(B,s) |
| 50 |
READ(B,t) |
|
|
|
t := t + 100 |
|
|
|
WRTIE(B,t) |
|
| 150 |
不是串行化调度
不可串行化调度分析:
两种情况:
( l )事务 Tl 写某个数据对象 A ,T2读或写 A ; ( 2 )事务 Tl 读或写某个数据对象 A ,T2写 A 。 冲突可串行化:
若s1,s2是一个调度d1的连续的两个操作,若s1,s2是属于不同的事物并且是不冲突的,则可以交换它们的顺序得到一个新的调度d2,称d1和d2是等价的,如果调度D1经过一系列的非冲突交换变为d2,称d1,d2是冲突等价的,称d1是一个冲突可串行化调度。
两段锁协议
封锁序列
编辑本段概念
所谓两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁: 1. 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁,而且 2. 在释放一个封锁之后,事务不再申请和获得任何其他封锁。 所谓“两段”锁的含义是,事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段。这在阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。第二阶段是释放封锁,也称为收缩阶段。在这阶段,事务可以释放任何数据项上的任何类型的琐,但是不能再申请任何琐。 例如事务T1遵守两段锁协议,其封锁序列是:(如右) 又如事务T2不遵守两段锁协议,其封锁序列是: Slock A … Unlock A … Slock B … Xlock C … Unlock C