当前位置: 首页 > news >正文

【数据库】数据库基于封锁机制的调度器,使冲突可串行化,保障事务和调度一致性

封锁使可串行化

专栏内容

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

开源贡献

  • toadb开源库

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

文章目录

  • 封锁使可串行化
  • 前言
  • 概述
  • 封锁调度器
  • 两阶段封锁
    • 原理
    • 分析
  • 死锁
  • 总结
  • 结尾

前言

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

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

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

概述

数据库并发控制,最常用的调度器结构,就是在数据库访问元素上加锁,防止非串行化的行为。

简单来讲,就是事务访问某个元素,先获取它的锁,避免其它事务的非串行化访问。

本文就来介绍这种通过封锁的模式,让调度器产生可串行化动作序列,以及它存在的问题。

在并发编程中,我们会接触到很多类型的系统变量,可以让我们对某一代码区域串行化执行,同样数据库中也会使用这些系统变量来实现数据库中的锁。

使得被锁保护的数据库元素,只能以串行的方式访问,在访问之前获取锁,如果获取不同,只能等待或者中止,获取到锁的就可以进行操作,操作完后释放锁。
在实际的数据库中,会有多种锁的类型,这在以后会进行详细介绍。

对于调度器使用锁时,必须在两种结构上都要保持正确:

  • 事务结构,

一是只有在加锁后,释放锁前,才能进行读写操作;
二是如果加锁了某个元素,那么使用后必须释放锁;

  • 调度结构

同一元素只能被一个事务加锁;而另一尝试加锁事务,要么中止,要么等待;这在不同的数据库实现不一样。

封锁调度器

下图展示了一个封锁的调度器模型架构。
在这里插入图片描述

我们来用一个简单的锁模型介绍一下,假如对于每个数据库元素我们只有一种锁,必须获取锁后才能进行读写,使用完后释放锁。

为了调度器进行决策,调度器有一个锁表,记录了每个数据库元元系的锁状态,如果其上有锁,说明有事务正在使用该数据库元素,其它事务不能访问。

  • 举例如下:
事务T1事务T2数据A数据B
2525
lock(A); read(A);
A = A + 100
write(A); unlock(A);125
lock(A), read(A)
A = A*2
write(A);unlock(A)250
lock(B); read(B);
B = B*2
write(B);unlock(B);50
lock(B); read(B);
B = B + 100
write(B);unlock(B);150

通过这个例子,我们看到一个有趣的现象,虽然调度器已经使事务访问时加了锁,事务对相同的数据库元素也是串行访问,但是最终的调度是不可串行化的,最后状态是不一致的。

说明只是简单封锁,例中的结果不是冲突可串行化的结果。

两阶段封锁

这里介绍一种加锁的条件,叫做两阶段封锁(two-phase locking, 2PL),在这种令人吃惊的条件下,可以保证事务的调度是冲突可串性化的。

原理

两阶段封锁,加解锁需要满足这样的条件:

  • 在每个事务中,所有的封锁请求必须在所有解锁请求之前;

这里就是将事务分为了两个阶段,

  • 第一阶段是封锁阶段,在这个阶段,对需要访问的数据库元素依次加锁;
  • 第二阶段是解锁阶段,这个阶段里,不能再有封锁请求;依次释放锁的过程;

两阶段封锁,像事务一致性一样,对事务中动作顺序进行了限制,符合这一条件的事务,叫做两阶段封锁事务。

  • 举例

那我们再来看上面的例子,将它按2PL进行调度之后:

事务T1事务T2数据A数据B
2525
lock(A); read(A);
A = A + 100
write(A); lock(B); unlock(A);125
lock(A), read(A)
A = A*2
write(A);250
lock(B); 被拒绝
read(B);
B = B + 100
write(B);unlock(B);125
lock(B); unlock(A); read(B);
B = B*2
write(B);unlock(B);250

经过符合2PL条件的调度后,我们可以看到最终结果是符合冲突可串行化的,也就是与两个事务串行执行一样的结果。

分析

两阶段封锁是如何发挥作用的呢?

其实我们仔细观察,就会发现,事务执行的顺序与第一次解锁的顺序是一致的,也就是事务按照解锁的顺序串行在每个数据库元素上执行,这样保证了串行执行的效果,达到了冲突可串行化。

当然严格的可以用归纳法进行证明,这里就不再详述了。

死锁

两阶段封锁虽然可以让事务调度达到冲突可串行化,但是它有一个未解的问题——死锁,也就是调度器迫使几个事务等待另一个事务持有的锁,而该事务又需要等待前几个事务持有的锁。

举例如下:

事务T1事务T2数据A数据B
2525
lock(A); read(A);
lock(B); read(B);
A = A + 100
B = B*2
write(A);125
write(B);50
lock(B) 被拒绝
lock(A) 被拒绝

现在,两个事务都不能继续向下进行,都将永远等待,这将在后面的介绍中继续分享,会对这种问题进行解决。

总结

通过封锁的模式,可以让调度器产生冲突可串行化的调度,但是对于每个事务中涉及多个数据库元素的情况时,又存在死锁的风险。

结尾

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

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

相关文章:

【数据库】数据库基于封锁机制的调度器,使冲突可串行化,保障事务和调度一致性

封锁使可串行化 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更…...

大文件分片上传、分片进度以及整体进度、断点续传(一)

大文件分片上传 效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页面上写几个组件用来获取文件。 <body><input type"file" id"file" /><button id"uploadButton…...

Pytest 的小例子

一个简单的例子 下面代码保存到test_pytest.py 一个简单的例子 def inc(x):return x 1def test_answer():assert inc(3) 5def test_ask():assert inc(4) 5 pytest 需要安装一下 pip install pytest (Venv) D:\pythonwork>pip install pytest Collecting pytestDown…...

大数据(十一):概率统计基础

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》 再推荐一下最近热更的:《大厂测试高频面试题详解》 该专栏对…...

web前端之TypeScript

MENU typescript类型别名、限制值的大小typescript使用class关键字定义一个类、static、readonlytypescript中class的constructor(构造函数)typescript中abstractClass(抽象类)、extends、abstracttypescript中的接口、type、interfacetypescript封装属性、public、private、pr…...

计网Lesson6 - IP 地址分类管理

文章目录 1. I P IP IP 地址定义2. I P v 4 IPv4 IPv4 的表示方法2.1 I P v 4 IPv4 IPv4 的分类编址法2.2 I P v 4 IPv4 IPv4 的划分子网法2.2.1 如何划分子网2.2.2 如何确定子网的借位数2.2.3 总结2.2.4 题目练习 2.3 I P v 4 IPv4 IPv4 的无分类编址法 1. I P IP IP 地…...

Nat. Mach. Intell. | 预测人工智能的未来:在指数级增长的知识网络中使用基于机器学习的链接预测

今天为大家介绍的是来自Mario Krenn团队的一篇论文。一个能够通过从科学文献中获取洞见来建议新的个性化研究方向和想法的工具&#xff0c;可以加速科学的进步。一个可能受益于这种工具的领域是人工智能&#xff08;AI&#xff09;研究&#xff0c;近年来科学出版物的数量呈指数…...

MySQL海量数据配置优化教程

1.缓存大小调整 缓存是数据库中用于减少磁盘 I/O 操作的重要机制。通过增加缓存大小&#xff0c;可以减少对磁盘的访问&#xff0c;从而提高查询性能。 可以使用 innodb_buffer_pool_size 参数来调整 InnoDB 缓存的大小。例如&#xff0c;将缓存大小设置为服务器内存的 70% my…...

Mac-idea快捷键操作

–以下是程序员在Mac中常用的快捷键 弹出程序坞ctrol f3 窗口满屏&#xff0c;半屏 ctrol command f 切换同一个程序的窗口 command ~ 打开最小化窗口 command tab option 拷文件路径 command option c 显示隐藏文件command shift . 显示所有窗口 control 向上箭头 chrome 全屏…...

HarmonyOS脚手架:UI组件之文本和图片

前言 关于HarmonyOS脚手架&#xff0c;本篇是系列的第二篇&#xff0c;主要实现UI组件文本和图片的常见效果查看&#xff0c;本身功能特别的简单&#xff0c;其目的也是很明确&#xff0c;方便大家根据效果查看相关代码实现&#xff0c;可以很方便的进行复制使用&#xff0c;当…...

详细学习Pyqt5中的6种按钮

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…...

【工具】Zotero|使用Zotero向Word中插入引用文献(2023年)

版本&#xff1a;Word 2021&#xff0c;Zotero 6.0.30 前言&#xff1a;两年前我找网上插入文献的方式&#xff0c;网上的博客提示让我去官网下个插件然后才能装&#xff0c;非常麻烦&#xff0c;导致我对Zotero都产生了阴影。最近误打误撞发现Zotero自带了Word插件&#xff0c…...

利用Python爬虫爬取豆瓣电影排名信息

可以使用第三方库Beautiful Soup和Requests来编写一个简单的爬虫&#xff0c;从豆瓣电影Top100页面获取信息 import requests from bs4 import BeautifulSoupdef get_douban_top100():url https://movie.douban.com/top250headers {User-Agent: Mozilla/5.0 (Windows NT 10.…...

灯光开不了了,是不是NVIDIA的问题

如果你跟我一样灯光亮度调节不了了&#xff0c;然后显示适配器又没有了&#xff0c;你看一下是不是和我这个大怨种一样把NVIDIA卸了&#xff0c;为了这个东西&#xff0c;这屏幕亮瞎我的眼镜&#x1f622;&#x1f622;。只需要进入官网&#xff0c;你就可以直接找到&#xff0…...

线性可分SVM摘记

线性可分SVM摘记 0. 线性可分1. 训练样本到分类面的距离2. 函数间隔和几何间隔、(硬)间隔最大化3. 支持向量 \qquad 线性可分的支持向量机是一种二分类模型&#xff0c;支持向量机通过核技巧可以成为非线性分类器。本文主要分析了线性可分的支持向量机模型&#xff0c;主要取自…...

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃 出现下列问题&#xff0c;如何解决&#xff1f; 1. LabVIEW 程序因image.cpp或drawmgr.cpp中的错误而崩溃 2. 正在通过cRIO-9034运行独立的LabVIEW应用程序&#xff0c;但它因drawmgr.cpp中的错误而崩溃 …...

nodejs微信小程序+python+PHP贵州旅游系统的设计与实现-计算机毕业设计推荐MySQL

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

WebUI自动化学习(Selenium+Python+Pytest框架)003

1.元素操作 在成功定位到元素之后&#xff0c;我们需要对元素进行一些操作动作。常用的元素操作动作有&#xff1a; &#xff08;1&#xff09;send_keys() 键盘动作&#xff1a;向浏览器发送一个内容&#xff0c;通常用于输入框输入内容或向浏览器发送快捷键 &#xff08;2…...

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务&#xff0c;启动效率低下。如何将启动Appium服务也实现自动化呢&#xff1f; 这里需要使用subprocess模块&#xff0c;该模块可以创建新的进程&#xff0c;并且连接到进程的输入、输出、错误等管道信息&…...

【计算机网络笔记】802.11无线局域网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

用C++和python混合编写数据采集程序?

之前看过一篇文章&#xff0c;主要阐述的就是多种语言混合编写爬虫程序&#xff0c;结合各种语言自身优势写一个爬虫代码是否行得通&#xff1f;觉得挺有意思的&#xff0c;带着这样的问题&#xff0c;我尝试着利用我毕生所学写了一段C和python混合爬虫程序&#xff0c;目前运行…...

Android HCI日志分析案例1

案例1--蓝牙扫描设备过程分析 应用层发起搜索蓝牙设备&#xff0c;Android 官方提供的蓝牙扫描方式有三种&#xff0c;分别如下&#xff1a; BluetoothAdapter.startDiscovery(); //可以扫描经典蓝牙和BLE两种。BluetoothAdapter.startLeScan();//扫描低功耗蓝牙&#xff0c;…...

LangChain(0.0.339)官方文档四:Prompts下——prompt templates的存储、加载、组合和部分格式化

文章目录 一、 部分提示模板1.1 使用字符串值进行部分格式化&#xff08;Partial with strings&#xff09;1.2 使用函数进行部分格式化&#xff08;Partial with functions&#xff09; 二、Prompt pipelining2.1 String prompt pipelining2.2 Chat prompt pipelining 三、使用…...

鸿蒙开发笔记

最近比较火&#xff0c;本身也是做前端的&#xff0c;就抽空学习了下。对前端很友好 原视频地址&#xff1a;黑马b站鸿蒙OS视频 下载安装跟着视频或者文档就可以了。如果你电脑上安装的有node&#xff0c;但是开发工具显示你没安装&#xff0c;不用动咱们的node&#xff0c;直…...

「计算机网络」Cisco Packet Tracker计算机网络仿真器的使用

介绍 Cisco Packet Tracker&#xff1a;网络仿真工具&#xff0c;用于模拟网络配置。 &#xff08;一&#xff09; 配置交换机&#xff08;Switch&#xff09;&#xff08;通过 带外管理&#xff09; 带外&#xff1a;Out-of-Band, OOB写在前面&#xff1a;如何打开Console页…...

【已解决】if lock.acquire(block, timeout):KeyboardInterrupt

问题描述 Traceback (most recent call last): File "/media/visionx/monica/project/ResShift/app.py", line 134, in <module> demo.launch(shareFalse) File "/home/visionx/anaconda3/envs/ResShift/lib/python3.9/site-packages/gradio/bloc…...

将Excel中的数据导入shell脚本,并调用expect脚本

主脚本test.sh #!/bin/bash # 设置超时时间 set timeout 240 # 将 Excel 文件转换为 CSV 格式 # test.xlsx > temp.csv # 初始化一个二维数组 declare -A data # 逐行读取 CSV 文件&#xff0c;并将每个单元格的数据存储在二维数组中 row1 while IFS, read -r col1 col2 co…...

elementui el-table用span-method方法对相同的列名或行名进行合并

看到的一篇文章 同理 如果对第二列进行合并的话copy一下第一个方法&#xff0c;让值赋给第二个数组就可以 // 合并方法mergeCells({ row, column , rowIndex, columnIndex }) {debugger;if (columnIndex 1) {const _row this.spanArr[rowIndex];const _col _row > 0 ? …...

汇编语言实现音乐播放器

目标程序 用汇编语言实现一个音乐播放器&#xff0c;并支持点歌 Overview 乐曲是按照一定的高低、长短和强弱关系组成的音调&#xff0c;在一首乐曲中&#xff0c;每个音符的音高和音长与频率和节拍有关&#xff0c;因此我们要分别为3首要演奏的乐曲定义一个频率表和一个节拍…...

大型网站系统架构演化(Web)

大型网站系统架构演化 大型网站系统架构演化需要关注的维度涉及的技术演进过程单体架构垂直架构使用缓存改善网站性能缓存与数据库的数据一致性问题缓存技术对比Redis分布式存储方案Redis集群切片的常见方式Redis数据类型Redis 淘汰算法使用服务集群改善网站并发能力 大型网站系…...