【数据库概论】第十一章 数据库并发控制

news2024/11/26 16:26:01

第十一章 并发控制

在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务并行运行,这就是同时并发方式。当多个用户并发存取数据库时会产生多个事务同时存取同一事务的情况,如果对并发操作不加控制就可能破坏事务的一致性和数据库的一致性

11.1 并发控制概述

事务是并发控制的基本单位,保证食物的ACID特性是事务处理的重要任务。为了保证事务的隔离性和一致性,DBMS需要对并发操作进行正确的调度。

并发操作带来的数据不一致性包括以下几种情况:
1.丢失修改
两个事务T1和T2同时读入同一数据并修改,T2的提交结果破坏了T1的提交结果,导致T1修改被丢失。

2.不可重复读
不可重复读是指事务T1读取数据后,事务T2执行更新操作,使得T1无法再现前一次的读取结果。包含三种情况:

  1. 事务T1读取数据后,T2对其进行了修改,T1再次读数据的时候,得到了与前一次不同的值
  2. 事务T1按一定条件从数据库读取了数据记录后,T2删除了部分记录,当T1再次读数据的时候,发现某些数据消失了。
  3. 事务T1按一定条件从数据库读取某些数据之后,T2插入了一些记录,当T1再次按相同条件读取数据的时候,发现多了一些记录

后两种不可重复读被称为数据幻影现象

3.读脏数据
指事务T1修改某一数据并且写回磁盘,T2读取到该数据后,T1事务被撤销了,则T2中读到的数据是被撤销前的数据,为脏数据。

上述三类数据不一致的主要原因是并发操作破坏了事务的隔离性,并发机制就是要用正确的方式调度并发操作,使得一个用户事务的执行不受其他事务干扰,来避免数据的不一致性

主要控制技术有封锁、时间戳、乐观控制法和多版本并发控制,下面依次介绍这些方法。

11.2 封锁

封锁是实现并发控制的一个非常重要的技术。封锁指的是事务T在对某个数据对象进行操作之前,先请求系统对该对象进行加锁,仅当他完成操作后才允许其他事务对该对象进行操作。

基本的封锁类型有两种:排他锁(exclusive lock,简称X锁)和共享锁(share lock,简称S锁)。

排他锁又称为写锁,一般写操作使用,事务T给数据对象A加X锁后,不允许任何事物给A加锁和访问A,直到T释放A上的锁.

共享锁又称为读锁,如果事物T对对象A加上S锁。则该事务可以读但不可以修改A,而且其他事务只能对A加S锁而不能加X锁,直到所有的S锁释放。

11.3 封锁协议

在运用封锁的时候,还需要约定一些规矩,这些协议被称为封锁协议。对封锁方式制定不同的规则,就形成了各种不同的封锁协议。

1.一级封锁协议

一级封锁协议是指,事务T在修改数据R之前必须对其先加X锁,直到事务结束的时候才释放。事务结束包括COMMIT和ROLLBACK。一级封锁协议可防止丢失修改,并且保证事务T是可以恢复的。在一级封锁协议中, 仅仅是读数据而不修改,是不需要加锁的,因此不能保证可重复读,也不能保证不读脏数据。

2.二级封锁协议

二级封锁协议是指,在以及封锁协议基础上增下了事务T在读取数据R前必须先对其加上S锁,读完后方可释放。
二级封锁协议可以防止丢失修改,并且进一步防止读取脏数据。

3.三级封锁协议
三级封锁协议是指,在以及封锁协议上增加了事务T在读取数据R之前必须先对其加上S锁,直到事务结束才释放

该跟锁协议出了防止丢失修改和读取脏数据外,还进一步防止了不可重复读。

上述封锁协议主要区别在于什么操作需要申请封锁,以及何时释放锁。

11.4 活锁和死锁

活锁

如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2开始等待;如果此时T3也请求封锁R,那么当T1释放了R上的封锁后会首先通过T3的封锁请求,如果后面还有源源不断的事务请求的话,T2会陷入持续忙等的情况,但是忙等的情况还是有机会解除的,这就说活锁

避免活锁的简单方法是采用先来先服务策略。

死锁

如果T1封锁R1,T2封锁了R2,此时T1申请封锁R2,而T2又申请封锁R1。此时就会导致死锁——两个事务互相需要彼此的资源,但是两者都不释放锁。这就类似于两个人互相持枪对峙,然后两边都要求对方先放下枪。

目前数据库中解决死锁主要有两类方法,一类是预防死锁的发生,一类是采用一定手段解除死锁。

1.死锁的预防

  • 一次死锁法:要求每一个事务必须一次将所有的数据全部加锁,否则不能执行。这能够有效防止死锁的发生,但是由于扩大了封锁范围,降低了系统的并发度。第二,在动态运行时,一些数据原先不需要封锁的也可能变为要封锁的对象,事先难以精确确定每个事务要封锁的数据对象。也就是该法对于编译锁支持较好,但是对于动态运行时锁就有点无能为力了。
  • 顺序封锁法:顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按照该顺序实施封锁。比如B树索引中,可以从根节点开始,逐步封锁下一层的节点。该法可以很有效地防止死锁,但是数据库中封锁的对象极多,要维护这样的资源的封锁顺序成本极高。而且事务的封锁请求会随着事物的执行而动态变化。

可见,在操作系统中普遍采用的死锁预防并不太适合数据库,因此DBMS在解决死锁问题上主要采用诊断并解除死锁的方法。

2.死锁的诊断与解除

数据库系统中诊断死锁的方法与操作系统类似,一般使用超时法或者事物等待图法。

  1. 超时法
    如果一个事务等待时间显然超出了规定时限,则认为发生了死锁。该法很简单,但是可能会误判死锁,而且对超时时限的设置要求比较严格

在这里插入图片描述
在这里插入图片描述

一旦检测到系统中存在死锁,使用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务所有的锁,使得其他事务可以继续运行。

11.5 并发调度的可串行性

可串行化调度

多个事务正确地并发执行后的结果应该与按某一次序串行地执行这些事务时的结果相同
可串行性是并发事务正确调度的准则。

冲突操作指的是不同的事务对同一个数据的读写操作和写写操作。一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务的不冲突次序得到另外一个调度Sc‘,如果Sc’是串行的,则称Sc为冲突可串行化。如果一个调度是冲突可串行化的,则一定是可串行化调度。

冲突可串行化调度是可串行化调度的充分不必要条件

11.6 两段锁协议

为了保证并发调度的正确性,数据库管理系统的并发控制机制提供一定缩短来保证调度是可串行化的。目前普遍使用的是两段锁协议。

两段锁协议指所有事务必须分两个阶段对数据项进行加锁和解锁:

  • 对任何数据进行读写操作之前,首先申请并获得对该数据的封锁
  • 在释放一个封锁之后,事务不再申请和获得任何其他的封锁。

两段锁的含义是,事务分为两个阶段,第一阶段是获得封锁,这个阶段事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。第二阶段是释放封锁,这个阶段,事务可以释放任何数据项上的任何封锁,但是不能申请任何锁。

事务遵循两段锁协议是可串行化调度的充分条件,而不是必要条件。

11.7 封锁的粒度

封锁对象的大小称为封锁粒度。封锁的对象可以是逻辑单元,比如属性值的集合、元组、关系、索引等,也可以是物理项,比如页、物理记录等。

封锁粒度与系统的并发度和并发控制的开销密切相关。封锁粒度越大,数据库能封锁的数据单元越少,并发度越低;反之则并发度较高,但是由于需要调度系统资源,频繁加锁解锁,系统开销大。

如果一个系统中同时支持多种封锁粒度提供不同事务选择是比较理想的,这种封锁方法称为多粒度封锁

多粒度封锁

讨论多粒度封锁首先需要定义多粒度树。多粒度树的根节点是整个数据库,表示最大的数据粒度,叶节点表示最小的封锁粒度。比如如下一棵三级粒度树:
在这里插入图片描述

多粒度封锁协议允许多粒度树中每个节点被独立地加锁。对一个节点加锁代表着其后裔节点也被加以同样的锁。

因此,显示封锁指的是事务直接为数据对象加锁;隐式封锁是该数据对象没有被独立加锁,是由于其上级节点加锁而使得该数据对象加上了锁。

一般对某个数据对象加锁,系统除了要检查数据对象时有无显式封锁,还需要检查其上级节点有无被封锁,以及其所有子树节点。这样检查的效率很低,因此人们引进了一种新型锁——意向锁

意向锁

意向锁的含义是如果对一个节点加了意向锁,说明该节点的下层节点正在被封锁;对任意节点加锁时,必须先对他的上层节点加意向锁。

比如对任意元组加锁的时候,必须先对它所在的数据库和关系加意向锁。下面介绍三种常见意向锁:
在这里插入图片描述

11.8 其他并发控制机制

并发控制的方法出了封锁技术外还有时间戳方法、乐观控制法和多版本并发控制等。时间戳方法是给每一个事务盖上一个时标,并按照这个时间戳来解决事务的冲突操作

多版本并发控制

版本是指数据库中数据对象的一个快照,记录了数据对戏那个某个时刻的状态。

多版本并发控制和封锁机制相比,主要的好处是消除了数据库中数据对象的读和写操作的冲突,提高了系统性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32设备驱动-红外寻迹传感器驱动

红外寻迹传感器驱动 1、红外寻迹传感器介绍 红外寻迹传感器具有一对红外线发射管与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,输出接口会输出一个数字信号(低电平或高电平,取决于电路…

Nginx配置实例-反向代理案例二

实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口服务 nginx监听端口为9000, 访问 http://127.0.0.1:9000/edu/ 直接跳转到127.0.0.1:8080 访问 http://127.0.0.1:9000/vod/ 直接跳转到127.0.0.1:8081 一、准备工作 1. 准备两个tom…

TCP相关概念

目录 一.滑动窗口 1.1概念 1.2滑动窗口存在的意义 1.3 滑动窗口的大小变化 1.4丢包问题 二.拥塞控制 三.延迟应答 四.捎带应答 五.面向字节流 六.粘包问题 七.TIME_WAIT状态 八.listen第2个参数 九.TCP总结 一.滑动窗口 1.1概念 概念:双方在进行通信时&a…

2023年软考高级-系统分析师考试学习指导计划!

2023年软考高级-系统分析师考试学习指导计划! 一、导学阶段 第一天 考试情况及备考攻略:https://www.educity.cn/xuanke/rk/rjsp/?sywzggw 考试介绍:https://www.educity.cn/wangxiao2/c410653/sp110450.html 考试经验分享:h…

如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行

当您在 Linux 的命令行上工作时,有时希望快速查看文件的第一行,例如,有个日志文件不断更新,希望每次都查看日志文件的前 10 行。很多朋友使用文本编辑的命令是vim,但还有个命令head也可以让轻松查看文件的第一行。 在…

记录使用chatgpt的复杂经历

背景 由于最近要写论文,c站的gpt也变样了,无奈之下和同学借了一个gpt账号,才想起没有npv,不好意思去要,也不想买,于是我找了很多临时免费的直到我看到有一家,邀请10人即可,而且只用…

江苏专转本 专科生的最好出入

专转本 专科生的最好出入(1) 减少每天刷某音,刷朋友圈的时间无所事事、捧着手机刷的不是某音就是朋友圈,三年下来没去成一次图书馆。碎片化信息很大程度只是在浪费时间,不如每天比同龄人至少多出1小时时间,用来看书、护肤、健身。…

磨金石教育摄影技能干货分享|高邮湖上观花海

江苏高邮,说到这里所有人能想到的,就是那烟波浩渺的高邮湖。高邮在旅游方面并不出名,但是这里的自然人文景观绝对不输于其他地方。高邮不止有浩瀚的湖泊,春天的油菜花海同样壮观。春日的午后,与家人相约游玩&#xff0…

C语言--字符串函数1

目录前言strlenstrlen的模拟实现strcpystrcatstrcat的模拟实现strcmpstrcmp的模拟实现strncpystrncatstrncmpstrstrstrchr和strrchrstrstr的模拟实现前言 本章我们将重点介绍处理字符和字符串的库函数的使用和注意事项。 strlen 我们先来看一个我们最熟悉的求字符串长度的库…

【Echart多场景示例应用】Echarts柱状图、折线图、饼图、雷达图等完整示例。 echarts主标题和副标题的位置、样式等设置(已解决附源码)

**【写在前面】**前端时间做一个echarts的页面调整,临时客户要求加一个参数(总容量)显示,当时我就想用个默认的副标题吧,哪知客户和我说得紧跟在主标题后面,于是乎我就根据设置做了一个调整,我也…

燕山大学-面向对象程序设计实验 - 实验1 C++基础

CSDN的各位uu们你们好,今天千泽燕山大学-面向对象程序设计实验 - 实验1 C基础 相关内容, 接下来让我们一起进入c的神奇小世界吧,相信看完你也能写出自己的实验报告!实验一 C基础 1.1 实验目的 1.了解并熟悉开发环境,学会调试程序; 2&#xf…

超过10000人学习的Fiddler抓包教程,只需一小时就可以精通!

如果还是有朋友不太明白的话,可以看看这套视频,有实战讲解 零基础玩转Fiddler抓包在测试领域应用实战!一、Fiddler与其他抓包工具的区别 1、Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大。模拟http请…

【Linux】信号的产生、保存、捕捉处理 (四种信号产生、核心存储、用户态与内核态、信号集及其操作函数)

文章目录1、什么是信号?2、信号的产生2.1 通过键盘产生信号2.2 通过系统调用产生信号2.3 硬件异常产生的信号2.4 由软件条件产生的信号2.5 进程的核心转储3、信号的保存4、信号的捕捉4.1 用户态和内核态4.2 用户态到内核态的切换4.3 信号捕捉过程5、信号集操作函数以…

Spring——Spring整合Mybatis(XML和注解两种方式)

框架整合spring的目的:把该框架常用的工具对象交给spring管理,要用时从IOC容器中取mybatis对象。 在spring中应该管理的对象是sqlsessionfactory对象,工厂只允许被创建一次,所以需要创建一个工具类,把创建工厂的代码放在里面&…

Qt不会操作?Qt原理不知道? | Qt详细讲解

文章目录Qt界面开发必备知识UI界面与控件类型介绍Qt设计器原理控件类型的介绍信号与槽机制处理常用控件创建与设置常见展示型控件创建与设置常见动作型控件创建与设置常见输入型控件创建与设置常见列表控件创建于设置Qt中对象树的介绍项目源码结构刨析.pro.hmain.cpp.cppQt界面…

JVM的几种GC

GC JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代~ 新生代GC(minor GC): 指发生在新生代的垃圾回收动作,因为Java对象大多都具备朝生夕灭的特点,所以minor GC发生得非…

【问题排查】Linux虚拟机无法识别串口与ttyUSB

虚拟机串口连接失败问题 小哥的Linux系统是用虚拟机来装的,最近恰好需要用到串口和Linux进行通信,连接好硬件之后,发现虚拟机上找不到串口。 经查询才发现通过虚拟机启动的系统,正常情况下是无法使用串口进行通信的,需…

Ast2500增加用户自定义功能

备注:这里使用的AMI的开发环境MegaRAC进行AST2500软件开发,并非openlinux版本。1、添加上电后自动执行的任务在PDKAccess.c中列出了系统启动过程中的所有任务,若需要添加功能,在相应的任务中添加自定义线程。一般在两个任务里面添…

隐私计算将改变金融行业的游戏规则?

开放隐私计算 01背景2月底,相关部门印发《数字中国建设整体布局规划》提出,到2025年,基本形成横向打通、纵向贯通、协调有力的一体化推进格局,数字中国建设取得重要进展;到2035年,数字化发展水平进入世界前…

前端安全(自留)

目录XSS——跨站脚本常见解决CSRF ——跨站请求伪造常见解决XSS——跨站脚本 当目标站点在渲染html的过程中,遇到陌生的脚本指令执行。 攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。 常见 解…