Goal:即满足一致性又尽量提高吞吐量
Sequential equivalence checking: 两个事务的所有conflicting operation pair的相对顺序都是一样的
悲观并发控制:用锁实现 Sequential equivalence
锁的理解,2个作用
1)基本数据完整性,防止同时修改导致数据被破坏
2)操作完整性、事务完整性,复合状态的完整性,比如改名字,firstName, lastName,必须同时改。
不过归根到底是一样的,基本数据的完整性,比如一个int,可以看作是组成它的4个字节的复合状态的完整性。
乐观并发控制:allow to proceed , but check later
悲观并发控制
1)read mode 和 write mode 增加一定并发性
2)如果只是访问对象时候上锁,访问结束解锁,只能保证单个对象本身的一致性,保证不了事务的一致性。好比多线程下,修改对象的多个字段,针对这个操作设一个锁,或者锁整个对象,而不是每个字段单独做到互斥访问就可以了。
3)two phase locking 保证 sequential equivalence :保证了两个事务的所有conflicting operation pair的相对顺序一致,(如不一致则需要等待,以至一致)
strict two phase locking: 所有的锁都是commit时候释放
锁机制的缺点:死锁
死锁的3个必要条件
1)存在互斥锁,(都是read mode不存在问题),也就是存在等待
2)非抢占——只能等
3)wait for graph 有环
解决死锁等几个办法
1)tryLock, 有timeout的等待,timeout了就abort
2)死锁检测,维护wait-for graph,后台定时检查是否有环,abort其中一个
3)防止死锁的发生,针对死锁的3个必要条件
a) readonly
b) 允许抢占
3)在一开始申请所有的锁,或者以相同顺序申请锁,其实是相当于把多个对象的访问、多个锁,合并成一个整体锁。
乐观并发控制
1 随便写,但是commit的时候check sequential equivalence:cascading abort
2 Timestamp Ordering
Assign each transaction an id
Transaction id determines its position in serialization order
Ensure that for a transaction T, both are true:
1)T’s write to object O allowed only if transactions that have read or written O had lower ids than T.
2)T’s read to object O is allowed only if O was last written by a transaction with a lower id than T.
如果发现violate,abort
3 MVCC
For each object
1)A per-transaction version of the object is maintained,Marked as tentative versions
2)And a committed version
Each tentative version has a timestamp
On a read or write, find the “correct” tentative version to read or write from
“Correct” based on transaction id, and tries to make transactions only read from “immediately previous” transactions
对于key-value store的乐观并发的一种机制是 Conditional update: put(key, result, {ki, vi}),后面的kv列表是condition,也是得出result依赖的数据,如果没变则update,否则result失效,返回失败,client可以重新计算。condition列表可以简化为{k1, version1, k2, version2 },如果value数据比较大的话(比如字符串),这样,可以减小传输和比较的开销。