【CMU 15-445】Lecture 17: Timestamp Ordering Concurrency Control 学习笔记

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,它们与现有的几种隔离性级别的关系如下所示。
相关推荐
h7997103 分钟前
go资深之路笔记(九)kafka浅析
笔记·golang·kafka
冉冰学姐8 分钟前
SSM装修服务网站5ff59(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·装修服务网站
库库83913 分钟前
Redis分布式锁、Redisson及Redis红锁知识点总结
数据库·redis·分布式
云小逸18 分钟前
【Win32 多线程程序设计基础第六章笔记】
笔记
沧澜sincerely20 分钟前
Redis 缓存模式与注解缓存
数据库·redis·缓存
A9better20 分钟前
嵌入式开发学习日志39——stm32之I2C总线物理层与常用术语
stm32·单片机·嵌入式硬件·学习
Elastic 中国社区官方博客1 小时前
Elasticsearch 推理 API 增加了开放的可定制服务
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 默认的自动配置,笔记25
前端·spring boot·笔记
报错小能手2 小时前
linux学习笔记(35)C语言连接mysql
linux·笔记·学习
nzxzn2 小时前
MYSQL第二次作业
数据库·mysql