知识卡片
写锁读锁范围锁与两阶段锁如何实现串行化隔离
内容
隔离性的本质是并发问题:没有并发就天然具备隔离性,一旦并发就要用某种手段 让读写”看起来”是串行的。数据库靠三种锁实现:写锁(排他锁)持有期间其他 事务既不能写也不能加读锁;读锁(共享锁)可以被多个事务同时持有,持有期间 其他事务不能写,若某数据只有一个事务持有读锁还能直接升级为写锁;范围锁则 对一个区间整体加排他锁,区间内的数据既不能修改也不能新增删除——注意范围 锁不等于”一组排他锁的集合”,后者管不住新增数据。ANSI/ISO SQL-92定义的 最高隔离级别”可串行化”,就是对读写数据全都加上这三种锁,并按”加锁阶段” 和”解锁阶段”分两段处理读写锁与数据的关系,称为两阶段锁(2PL)。但隔离 程度和并发吞吐量天然是相互抵触的(并发控制理论),可串行化虽然隔离性 最强,代价却是并发能力最差,这正是数据库必须提供多档隔离级别、把选择权 交给用户的根本原因——用户实际是在”数据竞争会不会出问题”和”能撑多大并发” 之间做取舍。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第3章"事务处理"3.1.2节
"实现隔离性"(源文件:_epub-src对应OEBPS/Text/chapter27.xhtml)
- 结论依据:原文定义写锁/读锁/范围锁三种锁的具体行为,指出可串行化是
对读写数据全部加锁并按两阶段锁处理,并说明并发控制理论决定隔离程度
与并发能力相互抵触,直接支撑本卡片结论。
- 原始内容:并发控制理论决定了隔离程度与并发能力是相互抵触的,隔离程度
越高,并发访问时的吞吐量就越低。现代数据库一定会提供除可串行化以外
的其他隔离级别供用户使用……取得隔离性与吞吐量之间的平衡。