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

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.rhkb.cn/news/21977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

滚珠花键在使用时需注意什么?

滚珠花键是一种直线运动系统,当花键套利用其中的钢球在经过精密磨削的花键轴上直线运动时,可以传递扭矩。在使用滚珠花键时,需要注意以下几个重要的事项: 1、不要擅自拆卸滚珠花键的各部分,因为这样可能会导致异物进入…

Jenkins 视图(View)

Jenkins 视图(View) 一、视图是什么 Jenkins 视图(View) 如下图中 All、Apps 都是 Jenkisn 中的 View 左侧如果有 New View 或者 点击 All 这一行最右侧的 号,都可以创建视图 二、视图(View)的作用 点击最左侧的 All 可以看到所有的任务 随着项目不断发展&am…

蓝桥杯刷题2.21|笔记

参考的是蓝桥云课十四天的那个题单&#xff0c;不知道我发这个有没有问题&#xff0c;如果有问题找我我立马删文。&#xff08;参考蓝桥云课里边的题单&#xff0c;跟着大佬走&#xff0c;应该是没错滴&#xff0c;加油加油&#xff09; 一、握手问题 #include <iostream&g…

从零开始学习PX4源码9(部署px4源码到gitee)

目录 文章目录 目录摘要1.gitee上创建仓库1.1 gitee上创建仓库PX4代码仓库1.2 gitee上创建子仓库2.固件在gitee部署过程2.1下载固件到本地2.2切换本地分支2.3修改.gitmodules内容2.4同步子模块仓库地址2.5同步子模块仓库地址更新(下载)子模块3.一级子模块和二级子模块的映射关…

微服务SpringCloudAlibaba组件sentinel教程【详解sentinel的使用以及流量控制、熔断降级、热点参数限流等,附有示例+代码】

文章目录 四.Sentinel限流熔断4.1 sentinel介绍4.2 Sentinel 的历史4.3 Sentinel 基本概念资源规则 4.4 Sentinel 功能和设计理念4.4.1 流量控制4.4.2熔断降级什么是熔断降级熔断降级设计理念系统负载保护 4.5 Sentinel 是如何工作的4.6 Sentinel使用4.7 Sentinel 控制台4.8 Sp…

webmin配置终端显示样式,模仿UbuntuDesktop终端

webmin配置终端显示样式&#xff0c;模仿UbuntuDesktop终端 在webmin中&#xff0c;默认情况下是没有图形化桌面的&#xff0c;因此终端界面也不会像 Ubuntu Desktop 那样有预设的紫色背景和颜色主题。不过&#xff0c;你可以通过修改 ~/.bashrc 文件&#xff0c;并结合安装和…

PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)

PyTorch-基础 环境准备 CUDA Toolkit安装&#xff08;核显跳过此步骤&#xff09; CUDA Toolkit是NVIDIA的开发工具&#xff0c;里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本&#xff0c;如何去下载对应版本的Toolkit工…

AWS-SAA中文版题库

一家公司收集多大洲城市的温度、湿度和大气压数据。该公司每天从每个站点收集的平均数据量为500GB。每个站点都有高速互联网连接。该公司希望尽快将所有这些全球站点的数据聚合到一个AmazonS3存储桶中。解决方案必须将操作复杂性降至最低。哪种解决方案满足这些要求&#xff1f…

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/&#xff0c;登录个人账号&#xff0c;右上角加号…

微相E316实现FM电台监听

前面介绍了基于Matlab、矢量信号器或微相E316、HackRF One实现AM和FM调制解调&#xff0c;今天分享的内容是用微相E316、上位机和Matlab实现FM电台信号监听。注意本文仅用于科研和学习&#xff0c;私自搭建电台属于违法行为。 1.概述 微相E316、上位机和Matlab实现FM电台信号…

【总结】GraphRAG与传统RAG的深度对比及主流项目分析

GraphRAG和传统RAG的区别 GraphRAG和传统RAG都是为了增强大语言模型&#xff08;LLMs&#xff09;在特定领域的能力而发展出的技术&#xff0c;但它们在多个方面存在明显区别。 1. 知识组织方式 传统RAG&#xff1a;通常将大规模文本语料库分割成文本块&#xff0c;再利用嵌入…

SessionBox同一浏览器登录多账号独立IP教程

对于多账号运营的跨境营销人员来说&#xff0c;SessionBox提供了同一浏览器登录多账号的解决方案&#xff0c;但是很多人不仅需要多账号登录&#xff0c;对于登录Facebook、Instagram等账号来说&#xff0c;如何SessionBox与代理配合使用以确保真正的帐户分离更为重要&#xff…

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题&#xff0c;分为使用BFS和使用迪斯科特拉算法&#xff0c;这两种算法求解的范围是有区别的 BFS适合求解&#xff0c;边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…

ubuntu ffmpeg 安装踩坑

ffmpeg 安装踩坑 安装命令: sudo apt update sudo apt install ffmpeg如果以上命令没有报错&#xff0c;那么恭喜你很幸运&#xff0c;可以关闭这篇文章了&#xff01; 如果跟我一样&#xff0c;遇到如下报错&#xff0c;可以接着往下看&#xff1a; 报错信息&#xff1a; …

如何通过Windows环境远程控制MusicGPT在线生成高质量AI音乐

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 在这个快节奏的时代&#xff0c;音乐不仅是心灵的慰藉&#xff0c;更是创意的源泉。试想一下&#xff0c;在忙碌的工作间隙或悠闲的周末午后&#xff0c;只需轻敲几行…

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)

Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义参考&#xff1a; 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等参考&#xff1a; 大数据组件(四)快速入门实时数据…

Spring面试题2

1、compareable和compactor区别 定义与包位置:Comparable是一个接口&#xff0c;位于java.lang包,需要类去实现接口&#xff1b;而Compactor是一个外部比较器&#xff0c;位于java.util包 用法&#xff1a;Comparable只需要实现int compareTo(T o) 方法&#xff0c;比较当前对…

react(9)-redux

使用CRA快速创建react项目 npx create-react-app react-redux 安装配套工具 npm i reduxjs/toolkit react-redux 启动项目 在创建项目时候会出现一个问题 You are running create-react-app 5.0.0, which is behind the latest release (5.0.1). We no longer support…

HTTP SSE 实现

参考&#xff1a; SSE协议 SSE技术详解&#xff1a;使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为&#xff1a;服务端和客户端建立连接之后双方均保持连接&#xff0c;但仅支持服务端向客户端推送数据。推送完毕之后关闭连接&#xff0c;无状态行。 下面是基于…