两阶段枷锁(two-phase locking,2PL)是近 30 年来数据库唯一一种被广泛使用的串形化算法。 多个事务可以同时读取同一个对象,但只要出现任何写操作(修改或删除),则必须加锁以独占访问。

两阶段包括:

  1. 事务执行之前要获得锁(第一阶段)
  2. 事务结束之后要释放锁(第二阶段)

实现

2PL 用于 MySQL(InnoDB)和 SQL Server 中的“可串形化隔离”,以及 DB2 的“可重复读”。

每个对象通过一个「读写锁」隔离读写操作。

  • 共享锁进行读取。
  • 独占锁进行修改。
  • 读取先获取共享锁,如果要修改则升级为独占锁。
  • 事务获得锁之后一直持有到事务结束。

性能

慢和死锁

谓词锁

通过对区间条件加谓词锁。

索引区间锁