知识卡片
基于验证的乐观并发控制:先执行后验证
内容
锁、时间戳、MVCC都属于”悲观”策略——默认冲突大概率会发生,因此在 操作真正执行前就先做检查或协调。基于验证的方法反其道而行之,属于 “乐观”策略:默认大多数事务不会真的发生冲突(这个假设在”多数操作是 读、少量操作是写”的场景下往往成立),因此不在执行前做任何检查, 让事务直接在本地空间读写数据,只在事务准备提交的那一刻才做一次 验证,通过就提交、不通过就回滚重来。只读事务分两阶段(读阶段直接 从数据库读取需要的数据;验证阶段检查这次读取是否与其他事务冲突), 需要写数据的事务多一个写阶段(验证通过后才真正把本地空间的修改 写入数据库)。验证的核心逻辑是检查”是否存在时间上重叠、且数据集 有交集的事务”:如果另一个先完成验证的事务Tk已经完全结束(早于当前 事务Ti开始),或者Tk的写数据集与Ti的读写数据集完全没有交集(即使 时间上有重叠,因为互不触碰对方关心的数据,也不会产生冲突),验证 就能通过。这套策略最大的价值在于:如果实际运行时确实很少发生真正 的冲突,”不检查、事后验证”比”每次都先检查再执行”省下了大量原本 不必要的协调开销;代价是一旦冲突真的发生,之前做的全部工作都要 作废重来,冲突概率一旦上升,乐观策略反而会比悲观策略付出更高的 返工成本。
参考来源
- 位置:《数据库原理(微课版)》第11章《事务处理技术》11.3.4节"基于
验证的并发控制"(源文件:_epub-src/index_split_007.html)
- 结论依据:原文明确"在有些场景下,多数事务执行读操作,只有少量
事务执行写操作……多数操作可以并发执行,若使用锁、时间戳等并发
控制技术等先进行检查再执行,检查的代价就显得非常大……可以使用
基于验证的并发控制方法,即任何事务对数据库中数据对象的读写操作
都直接执行,在事务提交时进行验证……基于验证的并发控制方法通常
被称为乐观的并发控制方法,因为其实是假设所有事务都可以正常执行
完成",因此可以推出乐观并发控制"先执行后验证"的核心逻辑及适用
前提。
- 原始内容:任何事务对数据库中数据对象的读写操作都直接执行,在事务
提交时进行验证,通过验证的事务可正常提交,未通过验证的事务可
回滚……基于验证的并发控制方法通常被称为乐观的并发控制方法。