数据库事务与并发控制.md 3.2 KB


title: 数据库事务与并发控制 tags:

  • module
  • database
  • transaction
  • concurrency
  • joplin type: module source_type: reconstructed created: 2026-04-22 updated: 2026-04-22 ---

数据库事务与并发控制

[!abstract] 这一模块处理数据库里最容易混淆但也最关键的一块:既要让多个事务并发执行提高效率,又要尽量保证结果像串行执行一样正确。

模块结论

  • [[事务]] 是数据库中的逻辑工作单位,[[ACID]] 描述的是事务应具备的正确性目标。
  • 并发带来丢失修改、脏读、不可重复读、幻读等问题,因此必须引入 [[封锁协议]] 和隔离级别。
  • 并发控制不是单纯“加锁”,而是在正确性、吞吐量和等待成本之间做平衡。

一、事务是什么

  • 事务是一组不可分割的数据库操作。
  • 它要么整体成功,要么整体失败。
  • 常见流程是 BEGINCOMMITROLLBACK

二、ACID 四个特性

  • 原子性:要么全做,要么全不做。
  • 一致性:事务前后数据库状态应满足约束。
  • 隔离性:并发事务之间尽量互不干扰。
  • 持久性:提交后的结果不能轻易丢失。

复习重点

  • 一致性是目标,原子性/隔离性/持久性是支撑这个目标的重要方面。
  • ACID 不是只背四个词,而是理解每个词对应什么风险。

三、并发会带来哪些问题

  • 丢失修改:后写覆盖前写。
  • 脏读:读到了别人未提交的数据。
  • 不可重复读:同一事务前后两次读同一行,结果不同。
  • 幻读:同一范围查询前后结果行数变化。

区分不可重复读与幻读

  • 不可重复读更像“同一行被改了”。
  • 幻读更像“满足条件的行集合变了”。

四、锁与封锁协议

  • 共享锁 S:允许读。
  • 排他锁 X:允许写且排斥其他读写。

三级封锁协议

  • 一级:防丢失修改。
  • 二级:防脏读。
  • 三级:防不可重复读。

两段锁协议

  • 先加锁,再解锁。
  • 它用于保证调度可串行化,是事务调度理论中的关键规则。

五、隔离级别

  • 读未提交:并发能力高,但问题最多。
  • 读已提交:防脏读。
  • 可重复读:进一步防不可重复读。
  • 串行化:最严格,但并发性最低。

记忆方法

  • 隔离越强,读到的问题越少。
  • 但通常等待更多、吞吐更低、实现更重。

六、死锁与优化

  • 多个事务互相等待对方释放锁时会产生死锁。
  • 常见处理方式包括预防、检测和解除。
  • 工程上常通过统一加锁顺序、缩短事务时间、及时提交来降低死锁风险。

七、复习提问

  • ACID 四项中,哪几项与日志和恢复直接相关?
  • 脏读、不可重复读、幻读之间怎么区分?
  • 三级封锁协议和隔离级别各自在解决什么问题?

来源

  • [[raw/Joplin/计算机专业基础/数据库/_计算机考研复试数据库核心知识点整理.md]]
  • [[raw/Joplin/计算机专业基础/数据库/4.数据库——事务与并发控制.md]]

相关页面

  • [[数据库]]
  • [[数据库安全与恢复]]
  • [[事务]]
  • [[ACID]]
  • [[封锁协议]]