数据库原理之并发控制的基本概念

news2024/11/20 9:29:16

我们今天继续来看数据库原理,我们简单讲讲数据库的并发控制。


并发控制的定义

并发控制是为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度。并发控制的主要技术有:、时间戳、乐观控制法、多版本并发控制等。

并发操作带来的数据不一致性主要有以下三点:

  1. 丢失修改:两个事务T1和T2 读入同一数据并修改,T2 提交的结果破坏了 T1提交的结果,导致T1 的修改被丢失。
  2. 不可重复读:指事务T1读取数据后,事务T2 执行更新操作,使T1 无法再现前一次读取结果。
  3. 读脏数据:事务T1 修改某一数据后并将其写回磁盘,事务T2读取同一数据后,T1 由于某种原因被撤销,这时T1 修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致。

并发控制的基本方法

并发控制的基本方法有排他锁和共享锁

排他锁的定义:若事务T对数据对象A加上X锁,则只允许事务T读取和修改A。事务T释放A上的锁之前:其他事务不能读取和修改A,不能再对A 加任何类型的锁。

共享锁的定义:若事务T对数据对象A加上S锁,则事务T可以读取A,但不能修改A。事务T释放A上的S锁之前: 其他事务可以读取A,可以对A加S锁,但不能修改A,也不能对A加X锁

封锁协议

封锁协议有三级,分别叫一级封锁协议、二级封锁协议、三级封锁协议

  1. 一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
  2. 二级封锁协议:事务T在修改数据R之前必须先对其加锁(一级封锁协议),并且其他事务在取数据之前必须先对其加S锁,读完后即可释放S锁。
  3. 三级封锁协议:事务T在修改数据R之前必须先对其加锁(一级封锁协议),并且其他事务在读取数据之前必须先对其加S锁,直到事务结束才释放(二级封锁协议是读完就能释放)

活锁和死锁

活锁

活锁:事务T1封锁了数据R,事务T2又请求封锁R,于是T2 等待;T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了 T3 的请求,T2 仍然等待,T4 又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4 的请求.......T2 有可能永远等待,产生活锁。

避免活锁的方法:先来先服务策略

死锁

这里的死锁和操作系统当中的死锁不一样。这里的死锁是事务T1 封锁了数据R1,T2 封锁了数据 R2,T1 又请求封锁R2,因T2 已封锁了 R2,于是T1 等待T2释放R2上的锁,接着T2 又申请封锁 R1,因T1 已封锁了 R1,T2 也只能等待T1,释放R1 上的锁,这样T1在等待T2,而T2又在等待T1,T1和T2两个事务永远不能结束,形成死锁。

死锁的预防

  • 一次封锁法:每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
  • 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务按这个顺序实施封锁。

死锁的诊断与解除

诊断:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁或构建事务等待图存在回路。

解除:选择一个处理死锁代价最小的事务,将其撤销(UNDO),释放此事务持有的所有的锁。

可串行化调度 

定义:多个事务并发执行的结果=这些事务按某种次序串行执行的结果。

一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。例如现有事务 T1 和 T2,若 T1与 T2 的并发执行结果与先T1后 T2 相同,或者与先 T2 后 T1 相同那么这个调度就是正确的,否则就是错误的。

冲突可串行化调度

冲突操作:指不同的事务对用一个数据的读写操作(读和写)和写写操作(写和写)。

不同事务的冲突操作和同一事物的两个操作是不能交换的,如果发生交换,自然会发生错误。基于此,如果调度能保证冲突操作的次序不变,就称为冲突可串行化的调度。冲突可串行化调度一定是可串行化调度。


结语

今天对并发控制的介绍就到这里。如果对您有帮助,希望您可以为我留下点赞和关注。谢谢您,这对我真的很重要!

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

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

相关文章

加入运动健康数据开放平台,共赢鸿蒙未来

HarmonyOS SDK运动健康服务(Health Service Kit)是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台。在获取用户授权后,开发者可以使用运动健康服务提供的开放能力获取运动健康数据,基于多种类型数据构建运动健…

读人工智能全传04NP完全问题

1. 问题解决与搜索 1.1. 解决问题的能力无疑是区分人类和其他动物的关键能力之一 1.1.1. 解决问题是需要智慧的 1.2. 汉诺塔 1.2.1. 对于三个金环而言 1.2.1.1. 你不可能找到少于7次的解决方案了 1.2.2. 最初,我们只能选择移动最小的金环,只有将它…

【MySQL系列】VARCHAR 类型详解及其使用策略

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

IT高手修炼手册(2)cmd命令

一、前言 CMD(命令提示符)是Windows操作系统中的一个重要工具,用于执行命令行操作,旨在提高用户在CMD中的操作效率和便利性。 二、常用cmd命令及其简要说明 1. 快捷键F1:按F1一次,命令提示符向后切换到已经…

计算机应用数学--第二次作业

第二次作业计算题编程题 第二次作业 计算题 给定图 G G G(如图 1,图中数值为边权值),图切割将其分割成多个互不连通的⼦图。请使⽤谱聚类算法将图 G G G 聚类成 k 2 k 2 k2 类,使得: (a) RatioCut 最…

golang与以太坊交互

文章目录 golang与以太坊交互什么是go-ethereum与节点交互前的准备使用golang与以太坊区块链交互查询账户的余额使用golang生成以太坊账户使用golang生成以太坊钱包使用golang在账户之间转移eth安装使用solc和abigen生成bin和abi文件生成go文件使用golang在测试网上部署智能合约…

第一百四十七节 Java数据类型教程 - Java字符串字符

Java数据类型教程 - Java字符串字符 索引字符 您可以使用charAt()方法从String对象中获取特定索引处的字符。索引从零开始。 下面的代码打印索引值和字符在“W3CSCHOOL.CN"字符串中的每个索引处: public class Main {public static void main(String[] args) {String s…

SS8812T替代DRV8812的国产双通道H桥电机驱动芯片

由工采网代理的SS8812T是一款国产双通道H桥电机驱动芯片;该芯片为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案;可Pin-to-Pin兼容替代DRV8812,可广泛应用于POS、打印机、安防相机、办公自动化设备、游戏机、机器人等。 产品描述…

免费鼠标连点器有吗?需要付费吗?鼠标连点器电脑版免费推荐6款!

在数字化时代,鼠标连点器成为了许多用户提高工作效率、优化游戏体验的得力助手。然而,面对市场上琳琅满目的鼠标连点器软件,很多用户都会产生疑问:是否有免费的鼠标连点器?它们真的需要付费吗?今天&#xf…

【IT领域新生必看】Java中的对象创建魔法:小白也能掌握的五种方法

文章目录 引言为什么需要创建对象?创建对象的五种常见方式1. 使用 new 关键字示例: 2. 使用反射示例: 3. 使用克隆示例: 4. 使用序列化和反序列化示例: 5. 使用工厂方法示例: 选择合适的对象创建方式总结 引…

解决obsidian加粗中文字体显示不突出的问题

加粗字体显示不突出的原因:默认字体的加粗版本本来就不突出 解决方法:改成显示突出的类型Microsoft YaHei UI 【效果】 修改前:修改后: 其他方法: 修改css(很麻烦,改半天也不一定奏效&#…

《Windows API每日一练》8.3 scrollbar控件

在第三章SYSMETS2.C实例中,我们是通过CreateWindow函数创建窗口的参数窗口样式中添加垂直或水平滚动条。本节我们将讲述作为子窗口控件的滚动条。 本节必须掌握的知识点: 滚动条类 滚动条控件和着色 8.3.1 滚动条类 ■窗口滚动条与滚动条控件的异同 …

第一百四十八节 Java数据类型教程 - Java字符串搜索和Java子字符串

Java数据类型教程 - Java字符串搜索 我们可以使用indexOf()和lastIndexOf()方法获取另一个字符串中的字符或字符串的索引。例如 public class Main {public static void main(String[] args) {String str new String("Apple");int index str.indexOf("p"…

YOLOv8数据集可视化[目标检测实践篇]

先贴代码,后面再补充解析。 这个篇章主要是对标注好的标签进行可视化,虽然比较简单,但是可以从可视化代码中学习到YOLOv8是如何对标签进行解析的。 下面直接贴代码: import cv2 import numpy as np import osdef read_det_labels(label_file_path):with open(labe…

C++初学者指南-4.诊断---用gdb调试

C初学者指南-4.诊断—用gdb调试 幻灯片 gdb / 前端 gdbGNU的命令行调试器cgdb基于终端的gdb前端Linux安装:sudo apt-get install cgdbgdbgui基于浏览器的gdb前端网址:https://gdbgui.com/安装:sudo pip install gdbguiQt Creator可以连接gdbVisual St…

Vite: 近几个版本的更新

概述 在 2021 年 2 月,尤大正式推出了 Vite 2.0 版本,可以说是 Vite 的一个重要转折点,自此之后 Vite 的用户量发生了非常迅速的增长,很快达到了每周 100 万的 npm 下载量。同时,Vite 的社区也越来越活跃,…

实验3-Spark基础-Spark的安装

文章目录 1. 下载安装 Scala1.1 下载 Scala 安装包1.2 基础环境准备1.3 安装 Scala 2. 下载安装 Spark2.1 下载 Spark 安装包2.2 安装 Spark2.3 配置 Spark2.4 创建配置文件 spark-env.sh 3. pyspark 启动4. 建立/user/spark文件夹 1. 下载安装 Scala 1.1 下载 Scala 安装包 下…

Redis 八股文

标题 1. Redis主从同步原理:判断下线的条件:故障转移如何保证Sentinel高可用 1. Redis主从同步原理: 1、slave执行命令向master建立连接 2、master执行bgsave(后台存储),生成rdb快照(redis备份方式&#x…

基于STM32F407ZG的FreeRTOS移植

1.从FreeRTOS官网中下载源码 2、简单分析FreeRTOS源码目录结构 2.1、简单分析FreeRTOS源码根目录 (1)Demo:是官方为一些单片机移植FreeRTOS的例程 (2)License:许可信息 (3)Sourc…

如何使用C++调用Pytorch模型进行推理测试:使用libtorch库

如何使用C调用Pytorch模型进行推理测试:使用libtorch库 目录 如何使用C调用Pytorch模型进行推理测试:使用libtorch库一、环境准备1,linux:以ubuntu 22.04系统为例1. 准备CUDA和CUDNN2. 准备C环境3, 下载libtorch文件4, 编写测试li…