Example:






从数据约束一致性来看,模式A、B、C是可串行化的,D的结果显然不满足条件,但是更改一下D的运算,E就能通过数据约束一致性检查,所以从逻辑上讲模式D和E都是错误的,所以总结来说,判断一个调度是否正确,应该是检查调度中的read和write的执行顺序会不会导致数据约束不一致的可能。
Want schedules that are “good” , regardless of initial state and transaction semantics(与初始状态和事务语义无关)
Only look at order of read and writes

冲突操作形成了一个调度的环,说明是一个不可串行化的调度

调度C则无环,则说明是可以通过改变顺序,使它成为一个可串行化调度
What is P(S) for S = w3(A) w2(C) r1(A) w1(B) r1(C) w2(A) r4(A) w4(D) Is S serializable?
What is P(S) for S = w1(A) r2(A) r3(A) w4(A) ?
Assume P(S1) = P(S2) 存在Ti: Ti -> Tj in S1 and not in S2 =>S1 = …pi(A)... qj(A)… =>S2 = …qj(A)…pi(A)...(pi和qi顺序先后不同,或者不存在冲突操作) 存在矛盾S1, S2 not conflict equivalent
\neq >
S1, S2 conflict equivalent
Counter example: S1=w1(A) r2(A) w2(B) r1(B) S2=r2(A) w1(A) r1(B) w2(B)
P(S1) acyclic

S1 conflict serializable
Two new actions:
排它锁就是在同一时刻只允许一个事务拥有一个数据的排它锁
Three rules:
遵守这三条规则,就一定是冲突可串行化的,,但是可能出现死锁的情况
T1 | T2 |
|---|---|
l1(A); Read(A) | l2(B);Read(B) |
A A+100;Write(A) | B Bx2;Write(B) |
Assume deadlocked transactions are rolled back(假设死锁会进行回滚)
共享锁允许不同事务对同一个数据项加多把锁 共享锁与共享锁之间的兼容的 共享锁与排它锁之间是互斥的
S = ....l-Si(A) … … ui(A) … 在加S锁和解锁之间,不能有其他事务对该数据项进行加X锁(两者是不兼容的)
S = ... l-Xi(A) … … ui(A) …() 在加X锁和解锁之间,不能有其他事务对该数据项进行加S、X锁(X锁和X锁、S锁都是不兼容的)
一级封锁协议:
在事务T修改数据之前必须要加X锁,知道事务结束后才释放
二级封锁协议:
在一级封锁协议上加上,在事务T读取数据之前加上S锁,读完数据之后立即释放S锁
三级封锁协议:
在一级封锁协议上加上,在事务T读取数据之前加上S锁,直到事务结束释放锁