数据库并发控制原理

1.Transaction

数据库事务以Begin()开始,以Commit()Abort()结束。事务需要满足ACID属性。

1.1 ACID

Atomicity

  • A:Atomicity 原子性,即多个操作合并在一起,如一个原子一样不可分割。

    可通过一下方法实现:

    • Logging :记录一个事务里面的所有请求到 log 中,当 abort 时,可以根据 log 日志撤销操作。每一次在 Log 中新增操作时需同时持久化到硬盘中。

    • Shadow Paging:修改数据时,拷贝一份该数据的page,在其上面修改。当事务commit之后,该page才对其他事务可见。

  • C:Consistency,一致性,这个和分布式系统的里面的一致性含义并不相同。CAP 中的一致性更多指的是数个副本的一致。ACID 中的一致性指的是数据库处于应用程序所期待的状态。比如银行从 A 账户转一部分钱到 B 账户,肯定是希望 A+B 账户的总金额在任何时刻都是一样的。

  • I:Isolation,独立性,即不同的事务之间不会互相干扰,互相独立。

    数据库通过 concurrency control(并发控制)来保证不同事务之间的独立性,互不干扰。并发控制分为乐观模型和悲观模型。

    • Optimistic假设事物的冲突是很少发生的,只有当事务 commit 的时候,才会检查是否存在冲突,确实是否需要 abort。适合多读少写的场景。通常基于 MVCC,timestamp 的并发控制是乐观模型。
    • Pessimistic假设冲突是经常发生,在一个事务开启的时候,就先检查是否存在冲突。适合少读多写的场景。通常基于锁的的并发控制是悲观模型。
  • D:Durability,就是持久化。同样可以通过 logging 或 shadow page 来实现。

1.2 Schedule

schedule即对于多个事务如何安排执行策略的问题。

  • Serial Schedule

指的是多个不同事务按顺序执行。如下图先执行 T1 后再执行 $T2$,或先执行 T2 再执行 T1,两个 txn 不会穿插在一起。

如果数据库种所有的 schedule 都是 serial schedule,这样性能很差,相当于数据库是单线程执行的(不过 Redis 好像就是单线程)。数据库并发控制存在的意义就是让并发执行的 schedule 的结果和你 serial schedule 执行的结果一样。

  • Equivalent Schedule

在任何数据库状态下,如果两个 schedule 执行后均能得到相同的结果,那么称这两个 schedule 为 equivalent schedule。

  • Serializable Schedule

如果一个 schedule 和一个 serial schedule 互为 equivalent schedule,那么称该 schedule 为 serializable schedule。

  • Recoverable Schedule
posted @   lh123cha  阅读(180)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
主题色彩