知识卡片
基于时间戳的并发控制规则与活锁风险
内容
基于时间戳的并发控制完全不用锁,改用”谁先来谁优先”的时间顺序规则: 每个事务启动时被赋予一个唯一、递增的时间戳,代表它到达系统的先后 顺序;每个数据对象记录读过它的最年轻事务的时间戳(读时间戳)和写过 它的最年轻事务的时间戳(写时间戳)。核心逻辑是:一个事务只有在 “比已经操作过这个数据的所有事务都年轻(时间戳更大)”时,它的操作 才被允许——如果一个事务发现自己要读/写的数据已经被一个更年轻的 事务读过或写过,说明它”来晚了”,这个操作若被允许执行就会打乱应有 的时间顺序,因此直接拒绝该操作、把这个事务回滚重启,而不是让它 排队等待。这套机制天然不会产生死锁:因为事务从不等待其他事务, 一旦发现冲突就立即回滚重启,不存在”互相持有资源等对方释放”的 可能性,这是它相比[[锁粒度的并发度开销权衡与意向锁机制]]里锁机制 的一个结构性优势。但它没有解决活锁问题:一个事务如果运气不好, 可能被反复更年轻的事务抢先、连续多次回滚重启,永远无法真正提交 成功——用”无锁”换掉了死锁风险,却没有换掉”持续被抢跑”的风险, 这也是它相比锁机制”各有取舍、而非全面碾压”的关键局限。
参考来源
- 位置:《数据库原理(微课版)》第11章《事务处理技术》11.3.3节"基于
时间戳的并发控制技术"(源文件:_epub-src/index_split_007.html)
- 结论依据:原文明确"若TS(T)≥WT(A)(表示T比已读数据A的所有事务都
年轻),则允许T操作……否则,T要读的数据已被一个年轻事务修改,
读操作不能执行,事务T回滚并重启……基于时间戳的并发控制方法不会
产生死锁,因为没有事务需要等待其他事务的执行。但这种并发控制
方法还有可能导致出现活锁现象",因此可以推出时间戳并发控制的核心
规则及其在死锁/活锁问题上的取舍。
- 原始内容:基于时间戳的并发控制方法不会产生死锁,因为没有事务需要
等待其他事务的执行。但这种并发控制方法还有可能导致出现活锁现象。