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]]
- [[封锁协议]]