【数据库系统概论】第第12章 并发控制

news/2025/2/22 14:02:39

12.1 并发控制概述

并发控制是指数据库管理系统(DBMS)通过控制多个事务同时执行,保证数据的一致性和隔离性,避免事务间的相互干扰。

事务串行执行不能充分利用系统资源

并发执行的优点:能够减少处理机的空闲 时间,提高系统的效率

并发执行可能引发的问题

会产生多个事务同时存取同一数据的情况可能会存取和存储不正确的数据,破坏事务一致性和数据库的一致性
 

丢失修改(Lost Update)

两个事务对同一数据进行更新,其中一个事务的更新被覆盖

读“脏”数据(Dirty Read)

一个事务读取到另一个未提交事务修改的数据

不可重复读(Non-Repeatable Read)

一个事务在多次读取同一数据时,由于其他事务的修改,导致读取的结果不一致

幻读(Phantom Read)

一个事务在多次查询时,结果集因其他事务的插入或删除发生变化

幻读也称作幻影(phantom row)现象,是指事务T1读取数据后,事务T2执行插入或删除操作,使T1无法再现前一次读取结果。

(1)事务T1按一定条件从数据库中读取某些数据记录后,事务T2删 除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记 录“神秘地”消失了。

(2)事务T1按一定条件从数据库中读取某些数据记录后,事务T2插 入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录

数据不一致性原因:由于并发操作破坏了事务的隔离性

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

12.2 事务的隔离级别

事务隔离级别定义了一个事务与其他事务之间的隔离程度。SQL标准定义了以下四种隔离级别:

读未提交、读已提交、可重复读、可串行化

读未提交(Read Uncommitted)

“读未提交”是允许一个事务可以读取另一个未提交事务正在修改的数据。(允许读,不允许写

存在问题:可能出现      脏读、不可重复读、幻读。

读已提交(Read Committed)

只允许一个事务读其他事务已提交的数据。显然, “读已提交”可以有效避免读脏读

存在问题:不可重复读、幻读

可重复读(Repeatable Read)

“可重复读”是一个事务开始读取数据后,其他事务就不能再对该数据执行UPDATE操作了。

存在问题:幻读。

可串行化(Serializable)

最严格的隔离级别

事务按顺序逐一执行,完全避免了并发问题。

存在问题:性能开销较大。

  事务隔离级别并不是越高越好 ,应根据应用的特点和需求选择合适的事务隔离级别

MySql的默认级别是“可重复读"

12.3 封锁

商用的DBMS一般都采用封锁方法

  封锁是一种常见的并发控制机制,用于保证事务隔离性。

封锁就是事务T在对某个数据对象(例如表、记录等)操 作之前,先向系统发出请求,对其加锁

加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象

封锁的类型

  1. 排他锁(X锁)又称为写锁,允许事务读取和修改数据,但其它任何事务都不能再对A加任何类型的锁,

    直到T释放A上的锁
  2. 共享锁(S锁)又称为读锁,允许多个事务同时读取数据,但不能修改。若事务T对数据对象A加上S锁,则其它事务只能再对A 加S锁,而不能加X锁,直到T释放A上的S锁

封锁的粒度

  1. 表级封锁:对整个表加锁,适用于大批量操作,但并发度低。

  2. 行级封锁:对表中某一行加锁,并发度高,但开销较大。

12.4 封锁协议

封锁协议是事务加锁与解锁的规则【何时申请X锁或S锁 ,持锁时间 ,何时释放

对封锁方式规定不同的规则,就形成了各种不同的封锁协议

三级封锁协议

一级封锁协议

事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。

正常结束(COMMIT) ;非正常结束(ROLLBACK)

可防止丢失修改

二级封锁协议

一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁

可以防止丢失修改和读“脏”数据

三级封锁协议

一级封锁协议加上事务T在读取数据R之前必须先对其加S锁, 直到 事务结束 才释放

可以解决4个问题

12.5 活锁与死锁

封锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题

1. 活锁(Livelock):事务虽然在持续执行,但由于不断被让步,导致无法继续完成自己的任务。

  • 原因:频繁的资源让步或优先级调度机制。

  • 解决方法:采用公平调度策略。引入随机性,避免资源竞争的循环。

2. 死锁(Deadlock):两个或多个事务因相互持有对方需要的资源,导致相互等待,无法继续执行。

解决方法死锁预防:采用一次性申请所有资源策略。规定加锁顺序,避免循环等待

                死锁检测与解除:定期检测等待图,发现死锁后中止某个事务释放资源

                超时机制为每个事务设定超时时间,超时后自动终止并释放资源


http://www.niftyadmin.cn/n/5862358.html

相关文章

面阵工业相机提高餐饮业生产效率

餐饮行业是一个快节奏、高要求的领域,该领域对生产过程中每一个阶段的效率和准确性都有很高的要求。在食品加工、包装、质量控制和库存管理等不同生产阶段实现生产效率的优化是取得成功的关键步骤。面阵工业相机能够一次性捕捉对象的二维区域图像,并支持…

C++ 如何销毁进程

从C11开始&#xff0c;CSTL开始支持线程&#xff0c; 先看一个C11 thread的例子 #include "stdafx.h" #include <thread> #include <chrono> #include <iostream> #include <functional> #include <string>bool isRunning true; std…

vue 学习-vite api.js

/** 整机管理 * */ // 整机分类 列表 export const wholeMachineServersType params > ajaxGet({url: wholeMachine/serverstype/,params}) // 整机分类 新增 export const wholeMachineServersTypeAdd params > ajaxPost({url: wholeMachine/serverstype/,params}) /…

深度学习数据集

1 huggingface datasets 需要先安装 datasets库 pip install datasets 用coco数据集举例&#xff0c;我们可以搜索coco&#xff0c;然后通过页面右侧的use this dataset或者是 clone respository来获取数据集 https://huggingface.co/datasets/phiyodr/coco2017 huggingface的…

【深度学习】矩阵的理解与应用

一、矩阵基础知识 1. 什么是矩阵&#xff1f; 矩阵是一个数学概念&#xff0c;通常表示为一个二维数组&#xff0c;它由行和列组成&#xff0c;用于存储数值数据。矩阵是线性代数的基本工具之一&#xff0c;广泛应用于数学、物理学、工程学、计算机科学、机器学习和数据分析等…

跳跃游戏(力扣55)

题目问是否可以跳到数组最后一个下标&#xff0c;有的同学可能会思考如何模拟跳跃这个操作&#xff0c;但这是比较困难的&#xff0c;很容易把自己绕进去。可以换一种思路&#xff0c;我们不需要知道具体是如何跳到最后一个下标的&#xff0c;而是找到最大的跳跃范围。如果该跳…

应用层的协议-http/https的状态码

1xx&#xff1a;表示临时响应&#xff0c;需要操作者继续操作 2xx&#xff1a;成功&#xff0c;操作被成功接受并处理 3xx&#xff1a;一般是重定向问题 4xx&#xff1a;客户端的问题 5xx&#xff1a;服务端的问题 1xx&#xff1a; 100: 表示服务器收到客户端的第一部分请…

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…