Skip to content

第6章:事务隔离与并发控制

原子性、隔离性与持久性

事务将多步操作组成一个逻辑工作单位。原子性要求全部生效或全部不生效;隔离性规定并发执行允许观察什么;持久性规定已提交结果在指定故障后仍保留。约束一致性还依赖应用逻辑正确使用事务。

转账先扣 A 再加 B,需要原子性避免只扣不加;两个并发转账还需要适当隔离,避免互相覆盖。磁盘可靠不能替代并发控制。

可串行化

若并发历史等价于某个串行事务顺序,就具有可串行化性质。对普通读写历史,冲突图中事务为顶点,同一数据上的冲突操作按实际先后形成有向边;无环是冲突可串行化的充要条件。

两个事务都先读余额 100,再各写 90,可能丢失一次扣款。冲突图可出现双向边,说明不能等价于两次各扣 10 的串行执行。

锁协议

两阶段锁先获取锁,进入释放阶段后不再获取新锁,可保证冲突可串行化。严格变体至少把排他锁保持到事务结束,以避免其他事务读到未提交写入等恢复问题。

锁可能形成死锁,需要等待图检测、超时或预防策略。页结构的 latch 应只短期持有,不等于持续整个事务的逻辑锁。

MVCC 与快照隔离

MVCC 保存多个版本,使读取可以依据快照选择可见版本,减少读写阻塞。但多版本本身不是某一种隔离级别。

快照隔离下,两个事务可读取同一旧快照并更新不同记录而都提交。例:至少一名医生值班,A、B 都看到两人值班,各自把自己的记录改为下班,最终无人值班。这是写偏差,并非简单的同一行写写冲突。

串行化快照隔离、显式锁定或改写约束检查等方案可处理相关异常,但需要具体系统的实现保证。

练习

  1. 为丢失更新和写偏差分别画冲突关系,注明读写对象。
  2. 为什么“读不阻塞写”不能推出“完全串行化”?
  3. 两阶段锁中的两个阶段与两阶段提交是什么关系?说明它们解决的问题不同。

上次更新: