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


本节课主要介绍一些基于时间戳的并发控制协议。

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) RTS(X)、最后一次成功修改该变量的事务时间戳 W − T S ( X ) W-TS(X) WTS(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)<WTS(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)) RTS(X)=max(RTS(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)<RTS(X)或者 T S ( T i ) < W − T S ( X ) TS(T_i)<W-TS(X) TS(Ti)<WTS(X),说明这个写操作会影响未来的读或写,此时 T i T_i Ti会被中止并重启;否则,成功执行该写请求,并更新 W − T S ( X ) = T S ( T i ) W-TS(X)=TS(T_i) WTS(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)<WTS(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,它们与现有的几种隔离性级别的关系如下所示。
    在这里插入图片描述
  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值