--- title: 数据库事务与并发控制 tags: - module - database - transaction - concurrency - joplin type: module source_type: reconstructed created: 2026-04-22 updated: 2026-04-22 --- # 数据库事务与并发控制 > [!abstract] > 这一模块处理数据库里最容易混淆但也最关键的一块:既要让多个事务并发执行提高效率,又要尽量保证结果像串行执行一样正确。 ## 模块结论 - [[事务]] 是数据库中的逻辑工作单位,[[ACID]] 描述的是事务应具备的正确性目标。 - 并发带来丢失修改、脏读、不可重复读、幻读等问题,因此必须引入 [[封锁协议]] 和隔离级别。 - 并发控制不是单纯“加锁”,而是在正确性、吞吐量和等待成本之间做平衡。 ## 一、事务是什么 - 事务是一组不可分割的数据库操作。 - 它要么整体成功,要么整体失败。 - 常见流程是 `BEGIN` 到 `COMMIT` 或 `ROLLBACK`。 ## 二、ACID 四个特性 - 原子性:要么全做,要么全不做。 - 一致性:事务前后数据库状态应满足约束。 - 隔离性:并发事务之间尽量互不干扰。 - 持久性:提交后的结果不能轻易丢失。 ### 复习重点 - 一致性是目标,原子性/隔离性/持久性是支撑这个目标的重要方面。 - ACID 不是只背四个词,而是理解每个词对应什么风险。 ## 三、并发会带来哪些问题 - 丢失修改:后写覆盖前写。 - 脏读:读到了别人未提交的数据。 - 不可重复读:同一事务前后两次读同一行,结果不同。 - 幻读:同一范围查询前后结果行数变化。 ### 区分不可重复读与幻读 - 不可重复读更像“同一行被改了”。 - 幻读更像“满足条件的行集合变了”。 ## 四、锁与封锁协议 - 共享锁 S:允许读。 - 排他锁 X:允许写且排斥其他读写。 ### 三级封锁协议 - 一级:防丢失修改。 - 二级:防脏读。 - 三级:防不可重复读。 ### 两段锁协议 - 先加锁,再解锁。 - 它用于保证调度可串行化,是事务调度理论中的关键规则。 ## 五、隔离级别 - 读未提交:并发能力高,但问题最多。 - 读已提交:防脏读。 - 可重复读:进一步防不可重复读。 - 串行化:最严格,但并发性最低。 ### 记忆方法 - 隔离越强,读到的问题越少。 - 但通常等待更多、吞吐更低、实现更重。 ## 六、死锁与优化 - 多个事务互相等待对方释放锁时会产生死锁。 - 常见处理方式包括预防、检测和解除。 - 工程上常通过统一加锁顺序、缩短事务时间、及时提交来降低死锁风险。 ## 七、复习提问 - ACID 四项中,哪几项与日志和恢复直接相关? - 脏读、不可重复读、幻读之间怎么区分? - 三级封锁协议和隔离级别各自在解决什么问题? ## 来源 - [[raw/Joplin/计算机专业基础/数据库/_计算机考研复试数据库核心知识点整理.md]] - [[raw/Joplin/计算机专业基础/数据库/4.数据库——事务与并发控制.md]] ## 相关页面 - [[数据库]] - [[数据库安全与恢复]] - [[事务]] - [[ACID]] - [[封锁协议]]