Timestamp Ordering Concurrency Control
- [Timestamp Ordering Concurrency Control](#Timestamp Ordering Concurrency Control)
- [Basic Timestamp Ordering (BASIC T/O)](#Basic Timestamp Ordering (BASIC T/O))
-
- [Read Operations](#Read Operations)
- [Write Operations](#Write Operations)
- [Optimization: Thomas Write Rule](#Optimization: Thomas Write Rule)
- [Potential Issues](#Potential Issues)
- [Optimistic Concurrency Control (OCC)](#Optimistic Concurrency Control (OCC))
-
- [Validation Phase](#Validation Phase)
- [Dynamic Databases and The Phantom Problem](#Dynamic Databases and The Phantom Problem)
- [Isolation Levels](#Isolation Levels)
本节课主要介绍一些基于时间戳的并发控制协议。
Timestamp Ordering Concurrency Control
时间戳排序是一种乐观的并发控制协议,它假设事务间的冲突很少。系统中的每个事务 T i T_i Ti在执行前被赋予一个唯一 的时间戳 T S ( T i ) TS(T_i) TS(Ti),这个时间戳可以是系统时间或者一个计数器变量,各有优劣。若 T S ( T i ) < T S ( T j ) TS(T_i) < TS(T_j) TS(Ti)<TS(Tj),则系统认为,在一个串行调度中, T i T_i Ti需要在 T j T_j Tj前面执行。
Basic Timestamp Ordering (BASIC T/O)
最基础的时间戳排序协议会为数据库中的每个数据对象 X X X维护两个变量,分别是成功读取该变量的最大事务时间戳 R − T S ( X ) R-TS(X) R−TS(X)、最后一次成功修改该变量的事务时间戳 W − T S ( X ) W-TS(X) W−TS(X),并根据以下条件判断事务的操作是否能正常执行。
Read Operations
对于某个事务 T i T_i Ti发起的读 X X X请求,如果 T S ( T i ) < W − T S ( X ) TS(T_i) < W-TS(X) TS(Ti)<W−TS(X),说明将会读取未来将修改的值,此时 T i T_i Ti会被中止并重新启动;否则,成功执行该读请求,并更新 R − T S ( X ) = m a x ( R − T S ( X ) , T S ( T i ) ) R-TS(X)=max(R-TS(X), TS(T_i)) R−TS(X)=max(R−TS(X),TS(Ti))。
Write Operations
对于某个事务 T i T_i Ti发起的写 X X X请求,如果 T S ( T i ) < R − T S ( X ) TS(T_i)<R-TS(X) TS(Ti)<R−TS(X)或者 T S ( T i ) < W − T S ( X ) TS(T_i)<W-TS(X) TS(Ti)<W−TS(X),说明这个写操作会影响未来的读或写,此时 T i T_i Ti会被中止并重启;否则,成功执行该写请求,并更新 W − T S ( X ) = T S ( T i ) W-TS(X)=TS(T_i) W−TS(X)=TS(Ti)
在以上两个条件中,并没有确保未来的写不会影响现在的读,则可能出现不可重复读的现象,于是在操作成功执行时, T i T_i Ti需要备份 X X X的值确保自己可以重复读 X X X而不被未来的事务影响。
Optimization: Thomas Write Rule
对于基本的时间戳排序协议,存在一个优化,当操作为写操作且 T S ( T i ) < W − T S ( X ) TS(T_i)<W-TS(X) TS(Ti)<W−TS(X)时,可以忽略该写操作并继续执行 T S ( T i ) TS(T_i) TS(Ti),这是因为在未来已经存在对 X X X的写操作了,于是 T i T_i Ti对 X X X的写操作将永远不会被读到。如果 T S ( T i ) TS(T_i) TS(Ti)在此操作后还有对 X X X的读操作,那么可以对备份的 X X X值进行修改。
Potential Issues
- 维护备份会有额外的开销
- 长事务会面临饥饿问题
- 可能产生不可恢复的调度
Optimistic Concurrency Control (OCC)
乐观并发控制是另外一种乐观的并发控制协议,其主要思想是为每个事务开辟一个private workspace,类似git的版本管理。事务对某个对象的写操作会将该对象复制到workspace中并修改值,读操作则仅复制。当事务提交时,workspace中的修改将会进行有效性检查,如果检查通过,则更新至数据库中。
OCC包含以下三个阶段:
- Read Phase:在此阶段,DBMS维护事务读或写的对象集合,存储在workspace中
- Validation Phase:当一个事务提交时,DBMS根据一定规则判断该事务的对象集合是否与其他事务产生冲突
- Write Phase:如果通过上一阶段的校验,则将更新同步至数据库中;否则中止并重启该事务
Validation Phase
在验证阶段,对于事务 T i T_i Ti和 T j T_j Tj,分为以下三种情况:
- Case 1:在 T j T_j Tj开始读阶段前 T i T_i Ti结束了写阶段。也就是说, T i T_i Ti与 T j T_j Tj的执行时间线没有交集,那么很明显这两个事务不会冲突
- Case 2:在 T j T_j Tj开始写阶段前 T i T_i Ti结束了写阶段。也就是说, T i T_i Ti的写阶段与 T j T_j Tj的读阶段可能有交集,那么需要保证 T i T_i Ti的写对象集 与 T j T_j Tj的读对象集没有交集
- Case 3:在 T j T_j Tj读阶段结束前 T i T_i Ti结束了读阶段。也就是说, T i T_i Ti的写阶段与 T j T_j Tj的读阶段有交集,且可能与 T j T_j Tj的写阶段也有交集,那么需要保证 T i T_i Ti的写对象集 与 T j T_j Tj的读写对象集都没有交集。
Dynamic Databases and The Phantom Problem
之前考虑的都是静态数据库,而在动态数据库中(记录除了更新还可能新增或删除),若仅仅锁住已存在的记录, 则可能产生幻读现象(Phantom Problem)。幻读就是指一个事务以相同条件做出的多次查询中,存在不同的结果。产生幻读的原因,则是仅仅考虑了数据库中已存在的记录,而未考虑新增或者删除的记录。
有以下方法可以解决幻读问题:
- Re-Execute Scans:在事务执行过程中,DBMS会记录所有查询的WHERE子句,在事务提交时,DBMS会重新扫描一次,确保所有查询结果的一致性。
- Predicate Locking:使用谓词锁,例如在WHERE子句中锁住条件,其他事务无法新增或删除满足被锁条件的记录。
- Index Locking:锁住索引键中的某个范围,使得其他事务无法在此范围中新增数据。有以下几种不同类型:
- Key-Value Locks:在单一的Key上加锁
- Gap Locks:在Key与Key之间的gap上加锁
- Key-Range Locks:锁住从一个Key到另一个Key之间的一段范围
- Hierarchical Locking:类似上节课提到的多粒度锁,利用意向锁提高效率
Isolation Levels
数据库的隔离性级别包含以下四种:
- Serializable 可串行化
- Repetable read 可重复读
- Read Commited 已提交读
- Read Uncommited 未提交读
除了这四种常见的,还有Cursor Stability和Snapshot Isolation,它们与现有的几种隔离性级别的关系如下所示。