数据库 并发控制

多用户数据库系统:允许多个用户同时使用同一个数据库的数据库系统

交叉并发方式:在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行

同时并发方式:在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行

并发控制机制是衡量一个数据库管理系统性能的重要标志之一

事务是并发控制的基本单位

并发控制的主要技术有封锁、时间戳、乐观控制法和多版本并发控制……

数据的不一致性

并发操作带来的数据不一致性包括丢失修改、不可重复读和读”脏“数据

丢失修改

两个事务 T1 和 T2 读入同一数据并修改,T2 提交的结果破坏了 T1 提交的结果,导致 T1 的修改被丢失

不可重复读

指事务 T1 读取数据后,事务 T2 执行更新数据,使 T1 无法再现前一次读取结果

一个事务先后两次读数据

具体情况

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

2、3 有时称为幻影现象

读“脏”数据

指事务 T1 修改某一数据并将其写回磁盘,事务 T2 读取同一数据后,T1 由于某种原因被撤销,这时被 T1 修改过地数据恢复原值,T2 读到的数据与数据库中的数据不一致,则 T2 读到的数据为“脏”数据,即不正确的数据

产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性

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

封锁

封锁是实现并发控制的一个非常重要的技术

封锁是事务 T 在对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁后事务 T 对该数据对象有了一定的控制,在事务 T 释放它的锁之前,其他事务不能更新此项数据对象

确切的控制由封锁的类型决定,基本的封锁类型有:排他锁(X 锁)和共享锁(S 锁)

封锁类型

  • 排他锁,又称写锁,X 锁,若事务 T 对数据对象 A 加上 X 锁,则只允许 T 读取和修改 A,其他任何事务不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁为止,保证了其他事务在 T 释放 A 上的锁之前不能再读取和修改 A
  • 共享锁,又称读锁,S 锁,若事务 T 对数据对象 A 加上 S 锁,则事务 T 可以读 A 但不能修改 A,其他事务只能再对 A 加 S 锁,而不能加 X 锁,直到 T 释放 A 上的 S 锁为止,保证了其他事务可以读 A,但在 T 释放 A 上的 S 锁之前不能对 A 做任何修改

封锁协议

一级封锁协议

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

作用:防止丢失修改,保证事务 T 是可恢复的

二级封锁协议

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

作用:防止丢失修改、防止读“脏”数据

三级封锁协议

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

作用:防止丢失修改、防止读“脏”数据、防止不可重复读

三级协议的区别

三级协议的主要区别在于什么操作需要申请封锁,何时释放锁(即持锁时间)

封锁协议的级别越高,一致性程度越高

活锁

一直等待解锁

解决方法

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

死锁

相互等待对方解锁

解决方法

  1. 采取一定措施预防死锁的发生
  2. 允许发生死锁,采用一定手段定期诊断系统中有无死锁,若有则解除之
死锁预防
一次封锁法

实施:要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行

存在的问题:

  • 一次将以后要用到的全部数据加锁,扩大封锁的范围,降低系统的并发度
  • 数据库中数据不断变化,原来不要求封锁的数据在执行过程中可能变成封锁对象,很难事先精确地确定每个事务所要封锁地数据对象,故只能扩大封锁范围,将事务在执行过程中可能要封锁地数据对象全部加锁,进一步降低并发度
顺序封锁法

实施:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实施封锁

存在的问题:

  • 数据库系统中封锁的数据对象极多,且随数据的插入、删除等操作不断变化,维护这样的资源封锁顺序非常困难,成本很高
  • 事务的封锁请求可以随着事务的执行而动态决定,很难事先确定每一个事务要封锁哪些对象,很难按规定的顺序施加封锁
死锁的诊断与解除

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

死锁的诊断
超时法

实施:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁

存在的问题:

  • 有可能误判死锁
  • 时限若设置太长,死锁发生后不能及时发生
等待图法

由事务等待图可知,死锁的情况可以多种多样

死锁的解除

两段锁协议

遵守两段锁协议的一定是一个可串行化调度

不遵守两段锁协议的可能是可串行化调度,也可能不是

内容

所有事务必须分两个阶段对数据项加锁和解锁

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

含义

事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段,在这个阶段,事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁;第二阶段是释放锁,也称为收缩阶段,在这个阶段,事务可以释放任何数据项上的任何类型的锁,但不能再申请任何锁

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

封锁的粒度

定义:封锁对象的大小

封锁对象:

  • 逻辑单元:属性值、属性值的集合、元组、关系、索引项、整个索引直至整个数据库
  • 物理单元:页(数据页或索引页)、物理记录……

封锁粒度与系统的并发度和并发控制的开销密切相关

封锁的粒度越大,数据库所能够封锁的数据单元就少,并发度就越小,系统开销越小;反之,封锁的粒度越小,并发度较高,系统开销越大

多粒度封锁:在一个系统中同时支持多种封锁粒度供不同的事务选择

选择封锁粒度时应同时考虑封锁开销和并发度两个因素,适当选择封锁粒度以求得最优的效果

多粒度封锁

定义多粒度树

多粒度树的根结点是整个数据库,表示最大的数据粒度,叶结点表示最小的数据粒度

多粒度封锁协议

内容:允许多粒度树中的每个结点被独立地加锁,对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁

多粒度封锁中一个数据对象可能以两种方式封锁,显式封锁和隐式封锁

  • 显式封锁:应事务的要求直接加到数据对象上的锁
  • 隐式封锁:该数据对象没有被独立加锁,是由于其上级结点加锁而使该数据对象加上了锁

多粒度封锁方法中,显式封锁和隐式封锁的效果一样,系统检查封锁冲突时不仅要检查显式加锁还要检查隐式封锁

对某个数据对象加锁,系统要检查该数据对象上有无显式封锁与之冲突;再检查其所有上级结点,看本事务的显式封锁是否与该数据对象上的隐式封锁(由于上级结点已加的封锁造成的)冲突;还要检查其所有下级结点,看它们的显式封锁是否与本事务的隐式(将加到下级结点的封锁)封锁冲突

意向锁

作用:数据库管理系统不需要逐个检查下一级结点的显式锁

含义:如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁

种类:意向共享锁(IS 锁),意向排他锁(IX 锁),共享意向排他锁(SIX 锁)

IS 锁

如果对一个数据对象加 IS 锁,表示它的后裔结点拟(意向)加 S 锁

IX 锁

如果对一个数据对象加 IX 锁,表示它的后裔结点拟(意向)加 X 锁

SIX 锁

如果对一个数据对象加 SIX 锁,表示对它加 S 锁,再加 IX 锁,即 SIX=S+IX

例子:对某个表加 SIX 锁,则表示该事务要读整个表(故对该表加 S 锁),同时会更新个别元组(故对该表加 IX 锁)

具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销

并发调度的可串行性

可串行化调度

定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同

可串行性是并发事务正确调度的准则

冲突可串行化调度

冲突操作:指不同的事务对同一个数,据的读写操作和写写操作

不同事务的冲突操作和同一事务的两个操作是不能交换的

定义:一个调度 Sc 在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另外一个调度 Sc' ,如果 Sc' 是串行的,称调度 Sc 为冲突可串行化的调度

若一个调度是冲突可串行化,则一定是可串行化的调度

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云原生实战课大纲

1. 云原生是什么 原生应用(java,pyrhon) 上云的过程应用上云遇到的问题1.微服务的拆分 微服务的访问关系应用的架构云原生适合什么样的人去学具备什么样的前提条件云原生要学习什么docker k8s devlops server mesh jks k8s监控吧自己的微服务上云另…

【C语言】

C语言 1. C语言基础1.1 数据类型和占位符1.2 异或1.3 关键字1.4 const1.5 extern1.6 typedef1.7 static1.8 左值和右值1.9 位进行操作赋值 2. C指针3. 二维数组和指针4. 函数传递二维数组4.1 形参给出第二维的长度。4.2 形参声明为指向数组的指针。4.3 形参声明为指针的指针。 …

如何使用免费的 Vecteezy 旅行视频

网址:https://www.vecteezy.com/ Vecteezy 是一个提供免费和付费矢量图形、模板、视频和其他创意资源的网站。该网站拥有大量旅行视频,可用于各种目的,例如个人使用、商业用途或教育用途。 要下载 Vecteezy 的免费旅行视频,请按…

阿里云服务器u1和经济型e实例有什么区别?

阿里云服务器ECS经济型e实例和通用算力型u1实例有什么区别?如何选择?ECS经济型e实例是共享型云服务器,通用算力型u实例是企业级独享型云服务器,e实例性价比高,现在2核2G3M带宽一年99元,云服务器u1价格相对要…

什么是权限?(Linux篇)

前言 其实我们在学会运用一些简单的Linux指令之后,我们可以简单的用ls查看当前目录的文件有哪些啊,可以使用tree用树形结构查看目录,可以使用touch来创建文件,用mkdir创建目录,可以使用rm来删除目录和文件,…

C#,数值计算——多项式计算,Poly的计算方法与源程序

1 文本格式 using System; using System.Text; namespace Legalsoft.Truffer { /// <summary> /// operations on polynomials /// </summary> public class Poly { /// <summary> /// polynomial c[0]c[1]xc[2]x^2 ..…

高频SQL50题(基础题)-5

文章目录 主要内容一.SQL练习题1.602-好友申请&#xff1a;谁有最多的好友代码如下&#xff08;示例&#xff09;: 2.585-2016年的投资代码如下&#xff08;示例&#xff09;: 3.185-部门工资前三高的所有员工代码如下&#xff08;示例&#xff09;: 4.1667-修复表中的名字代码…

数据库恢复技术

事务 含义&#xff1a;用户定义的一个数据库操作序列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单位 地位&#xff1a;恢复和控制并发的基本单位 区分事务和程序&#xff0c;一个程序中包含多个事务 定义事务 事务的开始与结束…

[linux网络实验] 多网卡绑定

聚合链路技术 什么是bonding 提供了一种将多个网络接口设备绑定到一个网络接口的方法。这可用于网络负载平衡和网络冗余&#xff1b; 实现将两个网卡虚拟成一个网卡。这种聚合设备看起来就像一个以太网接口设备。通俗地说&#xff0c;这意味着两个网卡拥有相同的 IP 地址&am…

PostgreSQL 机器学习插件 MADlib 安装与使用

MADlib 一个可以在数据库上运行的开源机器学习库&#xff0c;支持 PostgreSQL 和 Greenplum 等数据库&#xff1b;并提供了丰富的分析模型&#xff0c;包括回归分析&#xff0c;决策树&#xff0c;随机森林&#xff0c;贝叶斯分类&#xff0c;向量机&#xff0c;风险模型&#…

Leetcode刷题详解——黄金矿工

1. 题目链接&#xff1a;1219. 黄金矿工 2. 题目描述&#xff1a; 你要开发一座金矿&#xff0c;地质勘测学家已经探明了这座金矿中的资源分布&#xff0c;并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量&#xff1b;如果该单元格…

数据库表的设计——范式

目录 1. 设计数据表需要注意的点 2. 范式 2.1 范式简介 2.2 范式有哪些&#xff1f; 2.3 第一范式(1NF) 2.4 第二范式(2NF) 2.5 第三范式(3NF) 2.6 小结 1. 设计数据表需要注意的点 &#xff08;1&#xff09;首先要考虑设计这张表的用途&#xff0c;这张表都要存放什…

博捷芯BJCORE:国内划片机品牌优势

国内划片机品牌在半导体设备制造领域奋起直追&#xff0c;展现出以下几个优势&#xff1a; 1. 技术提升&#xff1a;国内划片机品牌在技术上持续取得突破&#xff0c;例如设备精准度和切割精度的提高&#xff0c;可以在短时间内完成大量加工&#xff0c;提高了生产效率。 2. 适…

【Python Opencv】Opencv画图形

文章目录 前言一、画图形1.1 画线1.2 画矩形1.3 画圆1.4 画椭圆1.5 添加文本 总结 前言 在计算机视觉和图像处理中&#xff0c;OpenCV不仅可以处理图像和视频&#xff0c;还提供了一组功能强大的工具&#xff0c;用于在图像上绘制各种形状和图形。这些功能使得我们能够在图像上…

centos利用find提权反弹shell

需要说明的是利用find命令进行提权的方式已经不存在了&#xff0c;因为Linux默认不会为find命令授予suid权限&#xff0c;这里只是刻意的制造出了一种存在提权的环境 首先我们先介绍一下find命令&#xff0c;find命令主要用来在Linux中查找文件使用&#xff0c;它可以进行最基础…

JVM如何运行,揭秘Java虚拟机运行时数据区

目录 一、概述 二、程序计数器 三、虚拟机栈 四、本地方法栈 五、本地方法接口 六、堆 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;堆空间细分 七、方法区 一、概述 不同的JVM对于内存的划分方式和管理机制存在部分差异&#xff0c;后续针对HotSpot虚…

Brute Force

Brute Force "Brute Force"&#xff08;暴力破解&#xff09;指的是一种通过尝试所有可能的组合来获取访问、解密或破解信息的攻击方法。这种攻击方法通常是基于暴力和不断尝试的&#xff0c;不依赖漏洞或弱点。通常用于破解密码、破坏系统或获取未经授权的访问权限…

【数据结构】链表经典OJ题,常见几类题型(二)

目录 题型三&#xff1a;链表相交&#xff0c;找相交节点思路解析OJ题实例解题代码 题型四&#xff1a;链表带环&#xff0c;找入环节点思路解析OJ实例解题代码 题型三&#xff1a;链表相交&#xff0c;找相交节点 思路解析 看到这类题型首先要判断链表是否相交&#xff0c;而…

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大&#xff0c;我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中&#xff0c;密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案&#xff0c;并提出一些解决方案。 一、密钥安全存…

Redis 常用的类型和 API

前言 在当今的软件开发中&#xff0c;数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求&#xff0c;出现了许多不同类型的数据库。其中&#xff0c;Redis 作为一种基于内存且高性能的键值存储数据库&#xff0c;因其快速的读取速度、丰富的数据结…