ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数据库并发控制核心考点全解析:从ACID到隔离级别

数据库并发控制核心考点全解析:从ACID到隔离级别 并发控制是数据库课程的必考重灾区也是最容易“听懂了但不会做题”的章节。这次我们不绕弯子直接按“考点拆解 答题模板 考场避坑”的路径把脏读、不可重复读、幻读、封锁协议、两段锁、死锁处理、多粒度封锁、隔离级别全部串成一套能直接上手背诵的内容。这个专题覆盖的事务与 ACID、三类并发异常、三级封锁协议、两段锁协议、死锁预防与检测、多粒度封锁与意向锁、隔离级别对照、SQL 实操验证基本对应本科数据库课程期末考试的论述题、设计题和综合题高频出题范围也覆盖常见面试八股。全文不需要数据库基础跟着章节走先理解后背诵考前 3 小时可以走完第一轮。1. 并发控制核心能力速览能力项说明覆盖考点事务 ACID、脏读/不可重复读/幻读、封锁协议、两段锁、死锁、多粒度封锁、意向锁、隔离级别适合对象数据库期末考试、考研复试、数据库工程师面试、课程设计答辩前速成核心产出20 个可直接套用的答题模板、易错点自查清单、3小时冲刺路径实践环境MySQL / Oracle / 达梦等常见数据库均适用文中示例以 MySQL 为主学习方式先理解三类并发异常 → 再背封锁协议 → 最后用答题模板输出验证方式本地数据库开两个会话模拟脏读、不可重复读、幻读现象是否需要编程基础基本不需要只要知道 SQL 大致语法即可这篇内容不是单纯抄概念而是把每个考点拆成“是什么、为什么考、怎么答”三层。每一段都可以直接变成考场答案或者作为面试口述的骨架。2. 适用场景与学习边界这个专题解决的是数据库理论课中最容易丢分的并发控制问题。适合三类读者第一类期末考前冲刺。时间不够教材太厚需要快速抓住最核心的考点。这个时候不要从第一章翻起直接从事务并发部分切入配合答题模板记忆比抱着教材硬啃效率高得多。第二类考研和面试复习。数据库并发控制是复试和岗位面试的高频题尤其是“两段锁协议为什么能保证可串行化”“死锁怎么处理”“MVCC 和锁的关系”这类问题需要形成一套稳定的回答结构。第三类做课程设计需要确认方案。比如课程设计里涉及多用户同时写入、订单并发扣库存、预约系统防超卖都会用到隔离级别和锁的概念理解并发控制能帮你在设计文档里写出合理的方案。使用边界也要说清楚这个专题是“考试导向”的速成内容不是数据库源码级调优指南。它不深入讲解 InnoDB 行锁的具体实现不深入分析 PostgreSQL 的 SSI 可串行化快照隔离也不涵盖分布式事务、两阶段提交的工程细节。如果你在做生产环境数据库调优还需要另看引擎源码与锁等待分析工具。另外强调一点所有封锁协议、隔离级别在不同数据库里的默认行为并不完全一致。考试以教材为准实践以具体数据库版本为准。比如 MySQL InnoDB 默认 REPEATABLE READOracle 默认 READ COMMITTED达梦数据库也提供类似隔离级别但命名和并发控制实现略有差异。本文后面会针对这个差异单独说明。3. 前置知识事务与 ACID 是并发控制的入场券并发控制的前提是事务。没有事务讨论并发异常就没有载体。先把这个基础打牢。3.1 事务是什么事务是数据库操作的最小逻辑单元一个事务里的 SQL 要么全部执行成功要么全部不执行。最经典的例子是转账A 账户扣 100B 账户加 100这两条 UPDATE 必须绑在同一个事务里。在 MySQL 中事务的基本写法如下START TRANSACTION; UPDATE account SET balance balance - 100 WHERE id 1; UPDATE account SET balance balance 100 WHERE id 2; COMMIT;如果第二条 SQL 失败需要回滚START TRANSACTION; UPDATE account SET balance balance - 100 WHERE id 1; UPDATE account SET balance balance 100 WHERE id 2; ROLLBACK;3.2 ACID 四个特性的得分点考试里十个题有八个会扯到 ACID所以这四个特性的关键词和例子必须背熟。特性含义典型例子实现机制原子性 Atomicity事务操作要么全做要么全不做转账过程某一方扣款失败则全部回滚日志 回滚机制 / ROLLBACK一致性 Consistency事务执行前后数据库完整性约束不被破坏转账前后总金额不变由应用和数据库约束共同保证隔离性 Isolation并发事务之间互相隔离不能看到对方的中间状态两个事务同时操作同一行时不能互相干扰锁、MVCC、隔离级别持久性 Durability事务提交后结果永久保存提交后的数据断电不丢失重做日志 redo log考试简答题如果只有 5 分就写四个特性的名字 一句话解释。如果 10 分就要补一个转账例子。答题模板事务是数据库并发控制的基本单位具有 ACID 四个特性。 原子性保证事务内操作要么全部成功要么全部回滚 一致性保证事务执行前后数据库完整性不被破坏 隔离性保证多个并发事务之间互不干扰 持久性保证事务一旦提交结果永久保存。 以转账为例A 扣款和 B 入账必须同为成功或同为失败中间任何一步出错都要回滚 保证账户总余额不变提交后即使系统断电本次转账结果也不能丢失。这里有一个高频混淆点一致性不只是数据库的事应用也要配合。比如账户余额不能为负这个约束如果应用层就没有检查数据库再强也拦不住业务逻辑错误。答题时如果写到一致性最好补一句“完整性约束与应用逻辑共同保证”。3.3 调度与可串行化并发控制的目标不是让事务真的串行执行而是让并发调度的结果等价于某个串行调度的结果这就是可串行化。考试常考判断题一个并发调度是正确的当且仅当它是可串行化的。两个操作如果来自不同事务且操作同一个数据项并且至少有一个是写操作就称为冲突操作。冲突操作的执行顺序不能随便交换。可串行化判断最常考的是用“冲突等价”判断两个调度是否等价核心是画出两个事务的操作序列检查冲突对顺序是否一致。答题模板并发事务的调度结果是否正确主要看它是否与某个串行调度的结果等价。 如果两个并发事务的执行结果和一个串行执行结果相同则称该调度是可串行化的。 可串行化是并发事务正确性的准则。 两个操作冲突的条件是来自不同事务、访问同一数据项、至少有一个是写操作。4. 并发三大问题的考点拆解数据库并发控制要解决的就是三个问题脏读、不可重复读、幻读。这三个概念必须做到能从“读哪个实例”的角度快速区分。4.1 脏读脏读指的是一个事务读到了另一个事务未提交的数据。场景拆开看事务 T1 修改了数据但还没提交事务 T2 读到了这个修改后的值。如果 T1 最后回滚T2 读到的就是一个“不存在”的数据。用一个表来表示时间线时刻事务 T1事务 T2t1UPDATE account SET balance 0 WHERE id 1t2SELECT balance FROM account WHERE id 1t3ROLLBACKT2 在 t2 读到的 balance 是 0但 t3 后 T1 回滚真正的数据还是原来的值T2 读到的就是脏数据。脏读是三类问题中最严重的一种因为它读到的是“从未真正存在过”的数据。4.2 不可重复读不可重复读指的是在同一个事务内两次读取同一个数据项结果不一致。原因是另一个事务在两次读之间修改并提交了这条数据。时刻事务 T1事务 T2t1SELECT balance FROM account WHERE id 1得到 100t2UPDATE account SET balance 80 WHERE id 1; COMMIT;t3SELECT balance FROM account WHERE id 1得到 80T1 同一个事务里两次查询结果不同这就是不可重复读。注意这里 T2 是提交之后的修改T1 读到的是已提交数据和脏读有本质区别。4.3 幻读幻读指的是在同一个事务内两次执行同样的范围查询第二次查到了第一次没有出现的行。原因是另一个事务在两次查询之间插入或删除了符合条件的记录。时刻事务 T1事务 T2t1SELECT * FROM account WHERE balance 50得到 2 行t2INSERT INTO account VALUES (3, 90); COMMIT;t3SELECT * FROM account WHERE balance 50得到 3 行多出来的那一行就像“幻影”一样。幻读和不可重复读的区别在于不可重复读是同一行数据值变化幻读是行数变化通常与 INSERT 或 DELETE 有关。4.4 三类问题速记表并发问题本质原因解决锁脏读读到未提交数据另一个事务未提交就回滚排他锁写锁一直持有到事务结束不可重复读同一事务内同一条数据两次读不一致另一个事务已提交修改共享锁读锁持有到事务结束幻读同一事务内范围查询行数不一致另一个事务插入/删除记录范围锁 / 表级锁 / 快照读隔离考场答题关键词“未提交数据”“同一行前后不一致”“结果集行数变化”。5. 封锁机制与三级封锁协议锁是并发控制最经典的实现手段。考试几乎必考锁类型、封锁协议、死锁与两段锁。这里把“锁”理解成一个通行证事务要读写数据必须先拿到对应类型的通行证拿到之后还要遵守释放规则。5.1 两种基本锁排他锁 X 锁与共享锁 S 锁排他锁也叫写锁用 X 表示。一个事务对数据对象加 X 锁后只有该事务能读和写这个对象其他事务不能加任何锁直到事务释放 X 锁。共享锁也叫读锁用 S 表示。一个事务对数据对象加 S 锁后可以读该对象但不能写。其他事务也可以加 S 锁进行读但不能加 X 锁。兼容关系如下当前锁请求 S 锁请求 X 锁无锁可以可以已有 S 锁可以不可以已有 X 锁不可以不可以5.2 三级封锁协议三级封锁协议是从一级到三级逐步加强的封锁规则。每一级解决不同问题。一级封锁协议事务在修改数据之前必须加 X 锁释放时机是事务结束提交或回滚。一级封锁协议能防止丢失修改但不能防止脏读、不可重复读和幻读。二级封锁协议在一级封锁协议的基础上要求事务读取数据前加 S 锁读完后可以立即释放。二级封锁协议增加了防止脏读的能力但仍可能出现不可重复读和幻读。三级封锁协议在二级封锁协议的基础上要求事务读取数据前加 S 锁并且 S 锁也要到事务结束后才释放。三级封锁协议可以防止脏读和不可重复读但幻读仍可能需要范围锁才能解决。用一张表对比封锁协议修改前必须加 X 锁读取前必须加 S 锁S 锁释放时机能防止的问题一级是否—丢失修改二级是是读完即可释放丢失修改、脏读三级是是事务结束才释放丢失修改、脏读、不可重复读这里有个特别容易混淆的点二级协议中 S 锁读完释放为什么不能防止不可重复读因为读完释放后另一个事务马上可以修改这条数据那么当前事务下一次读就可能读到新值。三级协议把 S 锁保留到事务结束才能保证整个事务内读到的值一致。5.3 两段锁协议两段锁协议是保证可串行化的一个重要协议也是考试简答题的常客。两段锁协议规定所有事务必须分成两个阶段申请锁和释放锁。扩展阶段只能申请锁不能释放锁收缩阶段只能释放锁不能申请新锁。事务开始时处于扩展阶段需要什么锁就申请什么锁。一旦开始释放第一个锁就进入收缩阶段之后不能再申请任何锁。必须写清楚的关键结论任何一个遵守两段锁协议的事务调度都是可串行化的。注意反过来不成立可串行化的调度不一定遵守两段锁协议。答题模板两段锁协议将事务分成两个阶段。 扩展阶段事务可以申请新锁但不能释放任何锁。 收缩阶段事务可以释放锁但不能申请任何新锁。 事务一旦开始释放锁后续所有加锁请求都不被允许。 两段锁协议是保证并发调度可串行化的充分条件 因为每个事务的加锁与释放锁之间存在一个明确的转折点 使得冲突操作的执行顺序与某个串行执行顺序一致。5.4 多粒度封锁与意向锁多粒度封锁指的是锁的对象可以是数据库、表、行、页等不同粒度。锁的粒度越大并发度越低开销越小锁的粒度越小并发度越高开销越大。考试判断题常考的就是这种权衡关系。多粒度封锁需要引入意向锁目的是告诉上层“这个事务正在对下层对象加锁请不要给上层对象加不兼容的锁”。意向锁分两种意向共享锁 IS 锁表示事务想要对某个下层对象加 S 锁意向排他锁 IX 锁表示事务想要对某个下层对象加 X 锁。意向锁的兼容规则必须背下来当前锁ISIXSXIS兼容兼容兼容不兼容IX兼容兼容不兼容不兼容S兼容不兼容兼容不兼容X不兼容不兼容不兼容不兼容记忆技巧IS 和 IX 是“意向”大家意向不同还可以共存S 和 X 是“实际”实际做读的只能和 IS 共存实际做写的和谁都不兼容。答题模板多粒度封锁允许事务对不同粒度数据对象加锁粒度越大并发度越低管理开销越小 粒度越小并发度越高管理开销越大。 在多粒度封锁中一个事务对一个数据对象加锁时 需要先对它的上层对象加意向锁例如对某一行加 S 锁或 X 锁之前 先对该行所在的表加 IS 锁或 IX 锁。 意向锁不阻塞任何完整的锁请求只用于表明下层加锁意图 从而避免逐个检查下层对象是否冲突提高加锁判断效率。6. 死锁与活锁原因、预防、检测与处理并发事务互相等待对方持有的锁谁也等不到就会形成死锁。死锁是并发控制实操中最容易遇到的问题也是考试综合题常见的背景。6.1 死锁产生的四个必要条件死锁的发生需要四个条件同时成立互斥条件至少有一个资源不能被多个事务同时共享例如同一行的 X 锁。请求与保持条件一个事务已经持有一个资源同时又申请新的资源在等待新资源时保持已占有的资源不放。不可剥夺条件已获得的资源只能由持有事务主动释放不能强制剥夺。循环等待条件多个事务之间形成环路每个事务等待下一个事务所占的资源。答题模板死锁是指两个或多个事务在执行过程中 因争夺资源而相互等待若无外力作用它们都将无法继续推进。 产生死锁的四个必要条件是互斥条件、请求与保持条件、不可剥夺条件和循环等待条件。 只有这四个条件同时满足死锁才可能发生。6.2 死锁预防死锁预防的本质是破坏四个必要条件中的一个。破坏请求与保持条件要求事务一次性申请执行中需要的所有锁申请得不到满足就一个锁也不拿。这种方式资源利用率低但可以预防死锁。破坏不可剥夺条件当一个事务申请新锁得不到满足时系统强制回收它已经持有的锁让它重新执行。实现复杂且可能导致事务反复回滚。破坏循环等待条件给所有数据对象规定一个加锁顺序每个事务必须按这个顺序申请锁从源头避免环形等待。考试简答题如果问“怎样预防死锁”写出以上任意两条并稍加解释基本就能拿满分。6.3 死锁检测与解除死锁检测与解除是另一种策略。数据库系统周期性地检测当前是否有死锁常用的方法是维护一个“事务等待图”如果图中出现环路就认为存在死锁。解除死锁的办法是选择一个代价最小的事务作为牺牲者将其回滚释放它持有的锁让其他事务继续运行。这个策略的关键踩分点是“牺牲者选择”通常选择执行时间最短、持有的锁最少或回滚代价最小的事务。6.4 活锁活锁是另一个概念容易和死锁混淆。活锁发生时事务并没有被永久阻塞而是由于优先级调度策略总是被优先级更高的事务抢占资源导致一直等不到执行机会。活锁的处理策略通常采用“先来先服务”的队列不让后来者插队就能避免活锁。做题判断技巧死锁是“谁也走不了”活锁是“等太久了但理论上还能走”。7. 隔离级别与并发控制的综合应用隔离级别是封锁协议在 SQL 标准中的落地。数据库移植和面试中最常考察的是四类隔离级别分别能解决什么问题。7.1 SQL 标准四种隔离级别隔离级别脏读不可重复读幻读并发度READ UNCOMMITTED 读未提交可能可能可能最高READ COMMITTED 读已提交不可能可能可能高REPEATABLE READ 可重复读不可能不可能可能标准定义InnoDB 下可防中SERIALIZABLE 串行化不可能不可能不可能最低需要特别注意在标准 SQL 定义里REPEATABLE READ 仍然可能发生幻读因为锁的范围可能只锁住了已存在的行没有锁住插入的间隙。MySQL InnoDB 通过引入间隙锁和 MVCC 快照读在 REPEATABLE READ 级别下也能阻止幻读但这是存储引擎层面的增强不是 SQL 标准本身的承诺。7.2 常见数据库默认隔离级别不同数据库默认隔离级别不同这是面试常问点数据库默认隔离级别MySQL InnoDBREPEATABLE READOracleREAD COMMITTEDPostgreSQLREAD COMMITTEDSQL ServerREAD COMMITTED达梦数据库READ COMMITTED默认配置支持设置更高隔离级别7.3 MVCC 与快照读MVCC多版本并发控制是现代数据库实现高并发读的重要机制。它的核心思路是不用读写互斥写事务会生成新版本数据读事务读的是某个时间点的快照从而实现“读写不阻塞”。在 MySQL InnoDB 中MVCC 依赖隐藏字段如事务版本号、回滚指针和 undo log 实现。REPEATABLE READ 级别下事务第一次读取时生成一致性快照后续读取都基于这个快照因此不可重复读被避免。面试常见追问是“MVCC 能解决幻读吗”。答案是普通快照读在 InnoDB REPEATABLE READ 级别可以避免幻读但当前读加锁的 SELECT、UPDATE、DELETE需要间隙锁配合才能避免幻读。这个细节在考试中不一定考但面试非常喜欢问。答题模板MVCC 即多版本并发控制核心思想是读写分离 写事务修改数据时生成新版本读事务读取旧版本快照 从而避免读操作等待写锁。 MVCC 可以提升数据库并发性能减少锁冲突。 但 MVCC 不等同于完全解决所有并发问题 在需要当前读的场景下仍然需要锁机制和间隙锁来保证正确的隔离级别。7.4 隔离级别与封锁协议的关系隔离级别可以理解为三级封锁协议的“标准版”。READ COMMITTED 大致对应二级封锁协议的理念REPEATABLE READ 对应三级封锁协议的理念SERIALIZABLE 则接近两段锁结合范围锁的效果。这个关系写进论述题可以明显提升答案深度因为它把两个章节串起来了。8. 数据库并发控制实操验证用两个会话模拟并发异常理论学完需要在本地数据库验证一下。这里用 MySQL 做一套最基础的并发控制验证流程你不需要额外安装工具只要有一个能执行 SQL 的客户端即可。8.1 环境准备MySQL 5.7 或 8.0 都可以用命令行或 Navicat、DBeaver 都行。准备一张测试表CREATE DATABASE IF NOT EXISTS concurrency_test; USE concurrency_test; CREATE TABLE account ( id INT PRIMARY KEY, balance DECIMAL(10, 2) ); INSERT INTO account VALUES (1, 100.00), (2, 100.00);8.2 模拟脏读会话 A 开启事务修改数据但不提交会话 B 在较低隔离级别下读取观察能否读到未提交数据。-- 会话 A SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; START TRANSACTION; UPDATE account SET balance 50 WHERE id 1; -- 此时不提交切到会话 B-- 会话 B SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT balance FROM account WHERE id 1;如果会话 B 读到 50说明发生了脏读。再把会话 A 回滚数据会恢复成 100。-- 会话 A 回滚 ROLLBACK;8.3 模拟不可重复读设置两个会话都是 READ COMMITTED会话 A 开启事务后连续读取两次会话 B 在两次读取之间修改并提交数据。-- 会话 A SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; SELECT balance FROM account WHERE id 1; -- 暂时不提交切到会话 B-- 会话 B SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; UPDATE account SET balance 80 WHERE id 1; COMMIT;回到会话 A 再执行一次查询SELECT balance FROM account WHERE id 1;如果第一次读到 100第二次读到 80就验证了不可重复读。把两个会话都改成 REPEATABLE READ再执行同样步骤第二次查询仍然会读到 100说明可重复读隔离级别解决了这个问题。8.4 模拟幻读会话 A 在 REPEATABLE READ 下执行范围查询会话 B 插入一条新记录并提交然后会话 A 再次执行同样的范围查询。-- 会话 A SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; SELECT * FROM account WHERE balance 50;-- 会话 B INSERT INTO account VALUES (3, 90); COMMIT;回到会话 ASELECT * FROM account WHERE balance 50;在标准 REPEATABLE READ 下普通 SELECT 的快照读不会看到新插入的行所以 InnoDB 中快照读取不到幻读。但如果把 SELECT 改成当前读比如SELECT * FROM account WHERE balance 50 FOR UPDATE第二次查询会看到新插入记录这时间隙锁的作用就体现出来了。8.5 观察锁等待与超时两个会话同时更新同一行可以观察锁等待行为-- 会话 A START TRANSACTION; UPDATE account SET balance balance - 10 WHERE id 1; -- 不提交-- 会话 B START TRANSACTION; UPDATE account SET balance balance - 10 WHERE id 1; -- 这里会阻塞等待如果等待超过innodb_lock_wait_timeoutMySQL 会返回锁等待超时错误。可以通过以下语句查看当前锁等待时间配置SHOW VARIABLES LIKE innodb_lock_wait_timeout;# 查看当前事务和锁信息 SHOW ENGINE INNODB STATUS;这是最直观的死锁与锁等待排查命令考试或面试遇到“事务卡住不动”第一反应就是查这个状态。9. 高频易错点与考场自查清单9.1 易错点易错点一脏读和不可重复读混淆。脏读对应“读未提交数据”不可重复读对应“读已提交但前后不一致”。最简单的判断方法是看另一个事务是否 COMMIT。易错点二二级封锁协议能不能防止不可重复读。不能。因为 S 锁读完即释放其他事务可以在下一次读取前修改数据。易错点三两段锁协议是否等价于可串行化。不等价。两段锁是可串行化的充分条件不是必要条件。考试判断题如果写“两段锁协议是可串行化的充分必要条件”这个结论是错误的。易错点四幻读是行数变化不是值变化。如果两次读到同一行但值不同是不可重复读如果两次范围查询结果多了一行或少了一行是幻读。易错点五死锁和活锁的预防策略不同。死锁常用一次性申请、按序申请、等待图检测与回滚牺牲者活锁常用先来先服务队列。易错点六内外模式与并发控制无关。考试大题偶尔会把并发控制与外模式、内模式混在一起答题时要明确“并发控制属于数据库管理系统内部实现核心对象是事务和锁”。9.2 考场答题模板汇总简答题五步答题结构第一步给出定义一句话说清是什么。 第二步说明产生条件或原因。 第三步列出关键分类或过程。 第四步补充应用场景或例子。 第五步用一句话点明它解决的核心问题。论述题八踩分点1并发控制要解决的是事务并发执行带来的数据不一致问题。 2三类问题是脏读、不可重复读、幻读。 3隔离级别从低到高是 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。 4封锁协议包括一级、二级、三级封锁协议锁类型包括 X 锁和 S 锁。 5两段锁协议是保证可串行化的充分条件。 6死锁有四必要条件预防或检测方式要说明。 7多粒度封锁适合大规模数据对象意向锁提高判断效率。 8实际数据库默认隔离级别不同需要结合产品说明。9.3 30 秒判断锁类型题如果题目给了一段调度问“这是什么锁协议”快速判断流程先看是否有读锁没有读锁只有写锁优先考虑一级协议。再判断读锁释放时机读完就释放是二级协议事务结束才释放是三级协议。最后看能否防止幻读需要加范围锁的属于更高要求的隔离级别。10. 3小时冲刺路径与收官建议最后给一套考前 3 小时的实际执行路径适合完全没有时间细看教材的情况。前 30 分钟只做一件事把第 3 节和第 4 节中的 ACID 与三大并发问题背熟然后自己用表格默写“脏读、不可重复读、幻读”的区别。中间 90 分钟重点突破封锁协议。先背 X 锁和 S 锁兼容表再背三级封锁协议对比表最后背两段锁协议的定义和死锁四个必要条件。每一章背完立刻用课后判断题自测。最后 60 分钟做两套综合题。一套是以“转账”为背景的论述题一套是以“查询和插入”为背景的设计题。做完之后对照第 9 节的答题模板查漏补缺。临考前一天不刷新题。只看四张表ACID 表、三类并发问题表、三级封锁协议表、隔离级别表。把死锁四个条件和两段锁协议用口头复述一遍。如果时间允许用本地 MySQL 按第 8 节跑一遍两个会话的验证流程。看到脏读和不可重复读真实发生比背十遍概念都管用。并发控制章节最大的坑不是概念难而是概念之间长得太像。把脏读、不可重复读、幻读、二级协议、三级协议、两段锁、死锁、活锁放在一张思维导图里反复对比考试时看到任何一个小问都能迅速定位到对应考点。这篇内容建议收藏考前复习直接翻到对应的表格式总结比重新翻书高效得多。
返回列表