【数据库】数据库并发控制的目标,可串行化序列的分析,并发控制调度器模型

数据库并发控制

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 数据库并发控制
  • 前言
  • 概述
  • 并发调度器
  • 可串行化
    • 可串行化概念
    • 案例分析
  • 可串行化的模型
  • 总结
  • 结尾

在这里插入图片描述

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

因此,本专栏的分享希望可以提高大家对数据库理论的认识和理解,对于感兴趣的朋友带来帮助。

概述

数据库同一时间会运行很多的事务,有客户端发起的,也有数据库系统内部产生的,那么这事务的并发执行,相互之间的影响会导致数据库的状态不一致;

虽然每个事务的执行状态都是正确的,而且也没有发生故障和错误,但也没法确保数据正确。

这就需要数据库进行统一协调,让各个事务并发执行时,按照一定的规范来让它们有次序的执行,这就是数据库中的调度器需要做的事。

本文就来聊聊数据库的并发调度器的那些事。

并发调度器

数据库调度器让并发执行的事务,保持数据库状态一致的过程,就是并发控制。

当事务执行时,需要对数据库元素进行读写,这时就会向调度器请求,大多数情况下,调度器都会直接进行读写处理;如果数据库元素没有在缓冲区时,先向缓冲区管理器进行请求,让它加载到缓冲区中。

而在某些情况下,立即执行是不安全的,调度器会延迟这些请求,有些并发控制技术中,调度器甚至会拒绝,导至事务的中止。

可串行化

调度器如何判断执行的安全性,也就是并发执行事务保持数据库状态的一致性,在数据库中叫做可串行化;

当然还有另一种更强,更重要的条件,叫做冲突的可串行化,这是大多数数据库真正实现的调度器。

可串行化概念

当一个事务在隔离状态下执行时(即没有其它事务与它并发执行),将数据库从任何一个状态转换为另一个一致的状态;通常都会有其它事务与它并发,所以这种原则没法适用。

所以我们需要一种可串行化调度的策略,让并发事务可串行化调度执行的结果,与一次执行一个事务产生的结果相同,那么这个调度产生的执行动作的序列,就叫做可串行化的调度。

案例分析

假设有两个事务T1,T2,操作对角为数据A和数据B,初始值都是25;
每个事务在执行计算时,会先读出数据,再修改,然后写回;

  • 事务执行序列为T1执行完,再执行T2
事务T1事务T2数据A数据B
2525
read(A,t)
t = t + 100
write(A,t)125
read(B,t)
t = t + 100
write(B,t)125
read(A,t)
t = t*2
write(A,t)250
read(B,t)
t = t*2
write(B,t)250
  • 事务执行序列为T2执行完,再执行T1
事务T1事务T2数据A数据B
2525
read(A,t)
t = t*2
write(A,t)50
read(B,t)
t = t*2
write(B,t)50
read(A,t)
t = t + 100
write(A,t)150
read(B,t)
t = t + 100
write(B,t)150

从这两个事务的执行序列来看,初始状态一样,但是在不同的执行顺序下执行后的状态确不一样。两个事务串行执行的结果,与两个事务执行的顺序相关。

以上是两个事务串行执行的结果,当事务并发时,结果与串行执行一样吗?

  • 两个事务并发执行中的一种可能序列
事务T1事务T2数据A数据B
2525
read(A,t)
t = t + 100
write(A,t)125
read(A,t)
t = t*2
write(A,t)250
read(B,t)
t = t*2
write(B,t)50
read(B,t)
t = t + 100
write(B,t)150

显然这次调度后的执行序列,得到的结果A=250,B=150,与上面两个事务串行执行的结果都不一样,最终状态是不一致的,所以这种调度是不可串行化的。

如何做到调度之后的可串行化,数据库通过可串行化的模型达到这一目标。

可串行化的模型

如果让多个事务简单的按装顺序来依次串行执行,一定是可以达到一致性的结果。多个事务的动作可以交叉,同时又与依次执行结果一样,这样的串行调度方式可以更高效的完成业务处理。

在大多数数据库中,采用封锁,时间戳和有效性确认,这三种方式组成的模型来达到并发事务可串行化,保证事务的特性。

总结

数据库并发控制的目标是,事务并发执行时,它们的执行序列可串行化,数据库的状态保持一致性。
在C语言中实现访问者模式,我们可以先定义一些结构体来表示元素对象和访问者对象。元素对象可以被访问者访问,而访问者对象可以访问元素对象并执行一些操作。

以下是一个简单的示例,其中定义了一个字符串类型的元素对象和一个输出字符串的访问者对象。在主函数中,我们创建了一个字符串类型的元素对象,然后使用访问者对象来访问它并输出 “Hello, world!”。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义字符串类型的元素对象
typedef struct Element {char* str;
} Element;// 定义输出字符串的访问者对象
typedef struct Visitor {void (*visit)(Element*);
} Visitor;// 定义一个函数,用于创建字符串类型的元素对象
Element* create_element(const char* str) {Element* element = (Element*)malloc(sizeof(Element));element->str = (char*)malloc(strlen(str) + 1);strcpy(element->str, str);return element;
}// 定义一个函数,用于销毁字符串类型的元素对象
void destroy_element(Element* element) {free(element->str);free(element);
}// 定义一个函数,用于执行输出字符串的操作
void visit_element(Visitor* visitor, Element* element) {visitor->visit(element);
}// 定义一个函数,用于创建输出字符串的访问者对象
Visitor* create_visitor() {Visitor* visitor = (Visitor*)malloc(sizeof(Visitor));visitor->visit = (void (*)(Element*))printf;return visitor;
}// 定义一个函数,用于销毁输出字符串的访问者对象
void destroy_visitor(Visitor* visitor) {free(visitor);
}int main() {// 创建一个字符串类型的元素对象,并赋值 "Hello, world!"Element* element = create_element("Hello, world!");// 创建一个输出字符串的访问者对象Visitor* visitor = create_visitor();// 使用访问者对象访问元素对象并输出 "Hello, world!"visit_element(visitor, element);// 销毁元素对象和访问者对象,释放内存资源destroy_element(element);destroy_visitor(visitor);return 0;
}

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

【稳定检索|投稿优惠】2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)

2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024) 2024 International Conference on Biological Neuroengineering and Health Big Data(ICBNHBD) 一、【会议简介】 2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)&#xff0c;这场科学盛宴&#xff0c;会议在中…

LeetCode刷题---汉诺塔问题

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述题目会把讲解部分分为3个部分&#xff1a; 1、题目解析 2、算法原理思路讲解 …

webGL开发虚拟展览方案

开发 WebGL 虚拟展览涉及到选择适当的工具、技术和框架&#xff0c;以及设计一个令人愉悦且互动性强的用户体验。以下是一个可能的开发方案&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.选择 Web…

【C语言】与文件有关的操作

目录 1. 前言2. 什么是文件&#xff1f;2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. 文件的顺序读写5.1 顺序读写函数介绍5.2 对比一组函数 6. 文件的…

对 Vision Transformers 及其基于 CNN-Transformer 的变体的综述

A survey of the Vision Transformers and its CNN-Transformer based Variants 摘要1、介绍2、vit的基本概念2.1 patch嵌入2.2 位置嵌入2.2.1 绝对位置嵌入(APE)2.2.2 相对位置嵌入(RPE)2.2.3卷积位置嵌入(CPE) 2.3 注意力机制2.3.1多头自我注意(MSA) 2.4 Transformer层2.4.1 …

记录一个奇怪的文件上传问题

项目是在企业微信内打开的webview&#xff0c;bug出现在一个更新数据的接口&#xff0c;参数为FormData对象&#xff0c;包含图片文件 ios&#xff1a;没问题&#xff0c;一切正常 安卓&#xff1a; 企业微信内打开&#xff0c;当FormData对象中包含一张图片文件&#xff0c…

【Python标准库】json

1.json库是用来做什么的&#xff1f; 完全独立于程序语言的轻量文本数据交换格式&#xff0c;用来生成和解析json数据格式的库 2.json的2种数据结构 第一种&#xff1a;键值对 语法&#xff1a;{"key":value,,,,}第二种&#xff1a;有序列表 3.json和python的…

indexOf与includes区别

判断字符串或者数组中是否存在对应元素 indexOf&#xff1a; 查找字符串中某个字符或字符串下表的位置&#xff0c;找到返回第一次出现的下标&#xff0c; 未找到返回-1 // 不传递第二个参数: 默认从0开始 [1,2,3,4,5].indexOf(3); // 查找字符3&#xff0c;找到返回3所在的下…

深度学习-学习笔记记录

1、点云语义分割方法分类 分为5类&#xff1a;点、二维投影、体素、融合、集成 2、融合与集成的区别 融合&#xff1a; 概念&#xff1a;主要是将不同来源、类型的模型&#xff0c;例如深度学习、传统机器学习等&#xff0c;的结果或特征进行结合&#xff0c;以得到一个更好的模…

js 搜索记录

背景&#xff1a; 移动端的搜索记录&#xff0c;不可能通过调取接口来记录瑟&#xff0c;所以通过在某某.js一个文件定义和处理逻辑。 代码&#xff1a; //某某.js var yumingSearch {init: function () {initF7.GloblalF7.onPageInit("yumingSearch", function …

c++的set容器和map容器

set容器 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<set> #include<algorithm> using namespace std; //set不给有重复的值&#xff0c;但是插入相同的数值不会报错&#xff0c;只是不会插入进去 void test01() …

直方图均衡化实现

一 直方图均衡化的概念 直方图均衡化(Histogram Equalization)是一种**增强图像对比度**(Image Contrast)的方法&#xff0c;其主要思想是将一副图像的**灰度直方图分布**通过**累积分布函数**变成**近似均匀分布**&#xff08;直观上在某个灰阶范围内像素值保持一致 &#xf…

2023年12月02日新闻简报(国内国际)

新闻简报 每天三分钟&#xff0c;朝闻天下事。今天是&#xff1a;2023年12月02日&#xff0c;星期六&#xff0c;农历十月廿十&#xff0c;祝工作愉快&#xff0c;身体健康&#xff0c;生活喜乐&#xff1a;&#xff1a; 国内新闻 1、商务部&#xff1a;对原产于澳大利亚的进…

【机器视觉技术栈】——工业相机

机器视觉常用部件 工业相机镜头光源 光源突出特征 **相机&#xff1a;**2D&#xff08;面阵相机、线阵相机&#xff09;、3D **镜头&#xff1a;**远心镜头 光源&#xff1a; 机器视觉系列 工业相机基础知识和选型 https://zhuanlan.zhihu.com/p/628519969 工业镜头基础…

【涂鸦T2-U】2、添加光感bh1750

文章目录 前言一、基础介绍二、电路图2.1 电路图12.2 电路图2——实际采用 三、代码四、编译五、刷机六、测试结果小结 前言 本章介绍如何在涂鸦T2-U开发板上添加光感bh1750驱动并实现定时读取数据。 一、基础介绍 BH1750( GY-302 )光照传感器 这篇文章有bh1750的基础介绍。…

八大插入算法(有注释)

直接插入排序 //直接插入排序 void InsertSortingDirectly(int* nums,int numsSize){int j0;for(int i1;i<numsSize-1;i){//定义一个中间变量保存当前要插入的值int tempnums[i];//在前面已排好序的序列中&#xff0c;找到合适的位置插入for(ji-1;j>0;j--){if(nums[j]&g…

滴滴面试:什么是数据库事务?InnoDB一次事务的执行过程?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如滴滴、阿里、极兔、有赞、shein 希音、百度、网易的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 什么是数据库事务&#xff1f; 说说 InnoDB一次事务的执行过…

Unity中PlayerPrefs在PC上存储位置总结

编辑器下和EXE存储位置是不同的&#xff0c;这也不难理解&#xff0c;是为了避免存储位置相同导致开发和测试冲突。 编辑器下位置&#xff1a;HKEY_CURRENT_USER\Software\Unity\UnityEditor\ExampleCompanyName\ExampleProductName EXE位置&#xff1a;HKEY_CURRENT_USER\Sof…

AES加密技术:原理与应用

一、引言 随着信息技术的飞速发展&#xff0c;数据安全已成为越来越受到重视的领域。加密技术作为保障数据安全的重要手段&#xff0c;在信息安全领域发挥着举足轻重的作用。AES&#xff08;Advanced Encryption Standard&#xff09;作为一种对称加密算法&#xff0c;自1990年…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了&#x1f4a5;我已经后悔了&#x1f62d;后悔没早点学习鸿蒙 HarmonyOS 概念&#xff0c;系统定位 1&#xff1a;鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统&#xff0c;它具有以下特别之处&#xff1a; 2&#xff1a;分布式架构&#xff1a;…