《数据库系统概论》- 课本理论整理08之并发控制(concurrency control)

多个用户 并发 存取DB时 ===》 会有产生多个事务同时存取同一数据的情况。
并发操作不加控制就会存取不正确的数据 ===》 破坏事务的一致性和DB的一致性。
因此DBMS提供并发控制保证DB中的数据安全性和完整性。

并发控制概述

事务是并发控制的单位,而保证事务的ACID特性是事务处理的重要任务。
事务的ACID特性遭到破坏的原因之一: 多个事务对DB并发操作造成的。
为了保证事务的一致性和隔离性,DBMS对并发操作进行正确的调度。

[案例: 飞机订票系统的一个活动序列]

① 甲售票点(事务T1)读出某航班的机票余额A, 设A=16;
② 乙售票点(事务T2)读出同一航班的机票余额A, 也为16;
③ 甲售票点卖出一张票,修改余额 A <== (A - 1),A为15,将A写回DB; // T1事务修改被丢失
④ 乙售票点卖出一张票,修改余额 A <== (A - 1), A为15,将A写回DB; // T2事务修改A随后覆盖T1事务的修改

结果明明卖出两张机票,DB中机票余额只减少1.

这种情况称之为DB的不一致性,这种不一致性是【并发操作】引起的。
并发操作带来的数据不一致性(unconsistency) ==> 丢失修改、不可重复读和读“脏”数据

导致数据不一致性的原因主要是: 【并发操作破坏事务的隔离性(isolation)

并发控制机制即用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免数据的不一致性。

并发控制的主要技术

1. 🔒封锁(locking)
2. ⏰时间戳(timestamp)
3. 🪂乐观控制法(optimistic schedular)
4. 🚉多版本并发控制(multi-version concurrency control, MVCC)

封锁(locking)

封锁即事务T在对某个数据对象eg: 表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象具有一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象

封锁协议(locking protocol)

1. 一级封锁协议 - 事务T在修改数据R之前必须先对其加X锁,直到【事务结束才释放】。 事务结束 =》 正常结束(COMMIT)和非正常结束(ROLLBACK)
2. 二级封锁协议 - 在一级协议基础上增加事务T在读取数据R之前必须先对其加S锁,【读完后即释放S锁】
3. 三级封锁协议 - 在一级协议基础上增加事务T在读取数据R之前必须先对其加S锁,【直到事务结束才释放】

活锁(livelock)- 指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程

[案例]

事务T1封锁数据R
  - 此时事务T2请求封锁数据R,T2等待
  - 此时事务T3请求封锁数据R,T3等待
事务T1释放数据R上的锁
  - 系统首先批准T3的请求
        - 此时事务T3封锁数据R
              - T2等待
              - T4请求封锁数据R,T4等待
事务T3释放数据R上的锁
  - 系统首先批准T4的请求
        - 此时事务T4封锁数据R  
              - T2等待
              =》 依次类推, T2有可能永远等待下去。
★ 避免活锁 =》 【先来先服务】 当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁🔒一旦释放就批准申请队列中第一个事务获得锁。

死锁(deadlock)- 两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

- 事务T1封锁数据R1, 事务T2封锁数据R2
   - 事务T1又请求封锁数据R2,事务T2又请求封锁数据R1
     - 事务T1等待T2释放R2上的锁, 事务T2又申请封锁R1,因为T1已经封锁R1则T2只能等待T1释放R1上的锁
>>> T1在等待T2, T2又在等待T1的局面,T1、T2两个事务永远不能结束,最终形成死锁。

解决死锁的方法

1. 一次封锁法 - 要求每个事务必须一次将所有要使用的数据全部加锁,否则就不继续执行。 缺点:降低DBS中并发度
2. 顺序封锁法 - 要求每个事务顺序执行

多版本并发控制(Multi Version Concurrency Control, MVCC) - 在DB中通过维护数据对象的多个版本信息来实现【高效并发控制】

【版本】指DB中数据对象的一个快照,记录了数据对象某个时刻的状态。

计算机存储设备成本降低 =》 为DBS中的数据库对象保留多个版本。
[案例]

- 一个数据对象A有两个事务, T1是写事务, T2是读事务
    - 假定先启动T1后启动T2, T2事务必须等待事务T1执行结束释放A上的封锁后才获得对A的封锁。(T1和T2实串行执行)

多版本并发控制利用【物理存储】上的【多版本】来维护数据的一致性。

多版本并发控制和封锁控制相比最大的好处在于: 消除DB中数据对象 读 和 写操作的冲突,有效提高系统的性能。

总结

  1. DB的重要特征: 【为多个用户提供数据共享】
  2. DBMS提供【并发控制机制】来协调【并发用户】的【并发操作】以保证【并发事务】的【隔离性】和【一致性】从而保证DB的一致性。
  3. DB的并发控制以【事务】为单位,通常使用【封锁技术】实现并发控制。
posted @   Felix_Openmind  阅读(771)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
*{cursor: url(https://files-cdn.cnblogs.com/files/morango/fish-cursor.ico),auto;}
点击右上角即可分享
微信分享提示