数据库管理系统实现技术

  • 数据库物理存储
    • 磁盘的结构与特性
    • DBMS数据存储与查询实现的基本思想
    • 数据库之表-记录与磁盘块的映射
    • 数据库之文件组织方法
    • Oracle DB物理存储简介
  • 数据库索引
    • 稠密索引与稀疏索引
    • 主索引与辅助索引
    • 其他索引
    • B+树(B+ Tree)
    • 散列索引
    • 可扩展散列索引
    • 线性散列索引
  • 数据库查询实现算法-I(一趟扫描算法)
    • 数据库查询实现算法概述
    • 连接操作的物理实现算法-表空间扫描法
    • 利用迭代器构造查询实现算法
    • 数据库查询的一趟扫描算法
  • 数据库查询实现算法-II(两趟扫描算法)
    • 为什么需要两趟扫描算法
    • 两阶段多路归并排序
    • 基于排序的两趟扫描算法
    • 基于散列的两趟扫描算法
  • 数据库查询优化技术
    • 查询优化的总体思路
    • 逻辑优化策略
    • 关系代数操作次序交换的等价性
    • 物理层查询优化 代价估算
  • 数据库事务处理技术 并发控制
    • 事务调度与可串行性
    • 冲突可串行性判别算法
    • 基于封锁的并发控制方法
    • 基于时间戳的并发控制方法
    • 基于有效性确认的并发控制方法
  • 数据库事务处理技术 故障恢复
    • 数据库的故障及其影响
    • 三种日志

数据库物理存储

磁盘的结构与特性

盘面:磁道:扇区
磁盘读写单位:Sector 簇Cluster/块Block:连续的若干个扇区

磁盘数据读写时间
–寻道时间(约在1-20ms)
–旋转时间(约0-10ms)
–传输时间(每4KB页<1ms)
物理存取算法考虑的关键:
–降低I/O次数
–降低排队等待时间
–降低寻道/旋转延迟时间:
同一磁道连续块存储;
同一柱面不同磁道并行块存储;

RAID技术: Redundant Array of Independent Disk
并行处理:并行读取多个磁盘
可靠性:奇偶校验与纠错
比特级拆分:一个字节被拆分成8个比特位,不同比特位存储于不同磁盘.
块级拆分: 一个文件由多个块组成,不同块存储于不同磁盘
扇区/块读写校验:对一个扇区/块读写做校验.
磁盘间读写校验: 多个磁盘间共同构成的信息读写做校验.

DBMS数据存储与查询实现的基本思想

数据库之表-记录与磁盘块的映射

数据库记录在磁盘上的存储:定长记录,还是变长记录(靠分隔符区分开始与结束)
记录是非跨块存储,还是跨块存储(靠指针连接)
数据库-表所占磁盘块的分配方法
连续分配:数据块被分配到连续的磁盘块上(会存在扩展困难问题)
链接分配:数据块中包含指向下一数据块的指针(访问速度问题)
按簇分配:按簇分配,簇是若干连续的磁盘块,簇之间靠指针连接;簇有时也称片段Segment或盘区extent
索引分配:索引块中存放指向实际数据块的指针

数据库之文件组织方法

数据组织要考虑更新(增、删、改)和检索需求
更新将涉及数据存储空间的扩展与回收问题
检索将涉及扫描整个数据库的问题、大批量处理数据问题
不同的需求要求不同的数据组织方法和存取方法
文件组织(File Organization)指的是数据组织成记录、块和访问
结构的方式,包括把记录和块存储在磁盘上的方式,以及记录和块之间
相互联系的方法
存取方法(Access Method)指的是对文件所采取的存取操作方法
一种文件组织可以采取多种存取方法进行访问

文件组织方法之一:无序记录文件(堆文件heap或pile file)
特点:记录可存储于任意有空间的位置,磁盘上存储的记录是无序的。更新效率高,但检索效率可能低
方法1:新记录总插入到文件尾部;删除记录时,可以直接删除该记录所在位置的内容,也可以在该记录前标记“删除标记”
方法2:在前者基础上,新增记录可以利用那些标记为“删除标记”的记录空间
频繁删增记录时会造成空间浪费,所以需要周期性重新组织数据库
数据库重组(Reorganization)是通过移走被删除的记录使有效记录连续存放,从而回收那些由删除记录而产生的未利用空间。
文件组织方法之二:有序记录文件(排序文件Sequential)
特点:记录按某属性或属性组值的顺序插入,磁盘上存储的记录是有序的。检索效率可能高。
用于存储排序的属性通常称为排序字段(Orderingfield),通常,排序字段使用关系中的主码, 所以又称排序码(Orderingkey)
当按排序字段进行检索时,速度得到很大提高;但当按非排序字段检索时,速度可能不会提高很多
改进措施是可为将来有可能插入的元组预留空间(这可能造成空间浪费),
或者再使用一个临时的无序文件(被称为溢出文件)保留新增的记录。
当采取溢出文件措施时,检索操作既要操作主文件,又要操作溢出文件。
所以需要周期性重新组织数据库,数据库重组是将溢出文件合并到主文件中,并恢复主文件中的记录顺序。
文件组织方法之三:散列文件(Hash file)
特点:可以把记录按某属性或属性组的值,依据一个散列函数来计算其应存放的位置:桶号(Bucket,块号或簇号等)。检索效率和更新效率都有一定程度的提高
用于进行散列函数计算的属性通常称为散列字段(Hashfield),散列字段通常也采用关系中的主码,所以又称散列码(hashkey).
不同记录可能被hash成同一桶号,此时需在桶内顺序检索出某一记录
链接法处理溢出
散列还有许多问题及许多的处理技巧,如散列桶的数目以及桶的大小,动态散列技术等等(这里不再叙述)

文件组织方法之四:聚簇文件(Clustering file)
聚簇:将具有相同或相似属性值的记录存放于连续的磁盘簇块中
多表聚簇:将若干个相互关联的Table存储于一个文件中—这可提高多表情况下的查询速度

Oracle DB物理存储简介

Oracle数据库组织为数据库(database)、表空间(tablespace)、操作系统文件、table、段(segment)、盘区(extent)和基本数据块(data blocks)

每个数据库分成一个或多个表空间,所有表空间的组合存储容量即是数据库的存储容量
有系统表空间SYSTEM和用户表空间;系统表空间由Oracle在创建数据库时自动创建,用于数据字典等的管理;用户表空间可由用户创建
每个表空间由一个或多个操作系统文件构成,一个操作系统文件只能与一个数据库相联,操作系统文件仅起占位的作用。数据在表空间中可跨文件进行操作。
操作系统文件中存储一个表(Table)或多个表,一个表可存储在一个文件中也可能存储在多个文件中。
上述为逻辑存储层
物理存储层由段(segment)、盘区(extent)和数据块(datablock)构成
数据块是最小的IO存储单位,又称为Oracle块、页(相当于扇区)
盘区是特定数量的连续数据块(相当于簇)。Oracle中的盘区是可以动态变化的,随不同数据库存储需求而调整
段是一组分配了特定数据结构的盘区,又分为数据段、索引段和临时段等一个表的数据可以存放在一个段内,也可以存放在多个段内。一个段可以存放一个表的数据,也可以存放多个表的数据(如聚簇文件)

数据库索引

索引是定义在存储表(Table)基础之上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的索引项(indexentries)组成,每一索引项又由两部分构成:
索引字段:由Table中某些列(通常是一列)中的值串接而成。索引中通常存储了索引字段的每一个值(也有不是这样的)。索引字段类似于词典中的词条。
行指针:指向Table中包含索引字段值的记录在磁盘上的存储位置。行指针类似于词条在书籍、词典中出现的页码。
存储索引项的文件为索引文件,相对应,存储表又称为主文件
索引文件是一种辅助存储结构,其存在与否不改变存储表的物理存储结构;然而其存在,可以明显提高存储表的访问速度。
索引文件组织方式有两种:(相对照的,主文件组织有堆文件、排序文件、散列文件、聚簇文件等多种方式)
排序索引文件(Orderedindices):按索引字段值的某一种顺序组织存储
散列索引文件(Hashindices):依据索引字段值使用散列函数分配散列桶的方式存储
在一个表上可以针对不同的属性或属性组合建立不同的索引文件,可建立多个索引文件。索引字段的值可以是Table中的任何一个属性的值或任何多个属性值的组合值
索引文件比主文件小很多。通过检索一个小的索引文件(可全部装载进内存),快速定位后,再有针对性的读取非常大的主文件中的有关记录

稠密索引与稀疏索引

稠密索引与稀疏索引
对于主文件中每一个记录(形成的每一个索引字段值),都有一个索引项和它对应,指明该记录所在位置。这样的索引称稠密索引(denseindex)
对于主文件中部分记录(形成的索引字段值),有索引项和它对应,这样的索引称非稠密索引(undense index)或稀疏索引(sparseindex)

稀疏索引如何定位记录
定位索引字段值为 K的记录,需要首先找相邻的小于K的最大索引字段值所对应的索引项,从该索引项所对应的记录开始顺序进行Table的检索,稀疏索引的使用要求—主文件必须是按对应索引字段属性排序存储,相比稠密索引:空间占用更少,维护任务更轻,但速度更慢,平衡:索引项不指向记录指针,而是指向记录所在存储块的指针,即每一存储块有一个索引项,而不是每条记录有一索引项----主索引

稠密索引如何定位记录
候选键属性的稠密索引—先查索引,然后再依据索引读主文件

主索引与辅助索引

主索引通常是对每一存储块有一个索引项,索引项的总数和存储表所占的存储块数目相同,存储表的每一存储块的第一条记录,又称为锚记录(anchor record),主索引的索引字段值为块锚的索引字段值,而指针指向其所在的存储块。
主索引是按索引字段值进行排序的一个有序文件,通常建立在有序主文件的基于主码的排序字段上,即主索引的索引字段与主文件的排序码(主码)有对应关系。
主索引是稀疏索引。

辅助索引 是定义在主文件的任一或多个非排序字段上的辅助存储结构。
辅助索引通常是对某一非排序字段上的每一个不同值有一个索引项:索引字段即是该字段的不同值,而指针则指向包含该记录的块或该记录本身;当非排序字段为索引字段时,如该字段值不唯一,则要采用一个类似链表的结构来保存包含该字段值的所有记录的位置。
辅助索引是稠密索引,其检索效率有时相当高。

一个主文件仅可以有一个主索引,但可以有多个辅助索引
主索引通常建立于主码/排序码上面;辅助索引建立于其他属性上面
可以利用主索引重新组织主文件数据,但辅助索引不能改变主文件数据
主索引是稀疏索引,辅助索引是稠密索引

其他索引

聚簇索引—是指索引中邻近的记录在主文件中也是临近存储的;
非聚簇索引—是指索引中邻近的记录在主文件中不一定是邻近存储的。

聚簇索引—是指索引中邻近的记录在主文件中也是临近存储的;
非聚簇索引—是指索引中邻近的记录在主文件中不一定是邻近存储的。
如果主文件的某一排序字段不是主码,则该字段上每个记录取值便不唯一,此时该字段被称为聚簇字段;聚簇索引通常是定义在聚簇字段上。聚簇索引通常是对聚簇字段上的每一个不同值有一个索引项(索引项的总数和主文件中聚簇字段上不同值的数目相同),索引字段即是聚簇字段的不同值,由于有相同聚簇字段值的记录可能存储于若干块中,则索引项的指针指向其中的第一个块。
一个主文件只能有一个聚簇索引文件,但可以有多个非聚簇索引文件
主索引通常是聚簇索引(但其索引项总数不一定和主文件中聚簇字段上不同值的数目相同,其和主文件存储块数目相同);辅助索引通常是非聚簇索引。
主索引/聚簇索引是能够决定记录存储位置的索引;而非聚簇索引则只能用
于查询,指出已存储记录的位置。

倒排索引

多级索引:当索引项比较多时,可以对索引再建立索引,依此类推,形成多级索引,常见的多级索引形式,如B树/B+树索引,以树型数据结构来组织索引项等
多属性索引:索引字段由Table的多个属性值组合在一起形成的索引
散列索引:使用散列技术组织的索引
网格索引(Gridfile):使用多索引字段进行交叉联合定位与检索

B+树(B+ Tree)

B+树索引:一种以树型数据结构来组织索引项的多级索引
一块中索引项的组织
Ki—索引字段值
Pj—指针,指向索引块或数据块或数据块中记录的指针
能够自动保持与主文件大小相适应的树的层次,每个索引块的指针利用率都在50%-100%之间。
非叶结点指针指向索引块,叶结点指针指向主文件的数据块或数据记录
叶结点的最后一个指针可能不同于它的其他指针—始终指向其下一个数据块

索引字段值重复出现于叶结点和非叶结点;
指向主文件的指针仅出现于叶结点;
所有叶结点即可覆盖所有键值的索引;
索引字段值在叶结点中是按顺序排列的;
级数(或层数)相同–平衡。如何保证?插入/删除记录时,伴随着结点的分裂与合并;分裂与合并将调整部分结点块中的索引项。

B Tree
索引字段值仅出现一次或者在叶结点或者在非叶结点;
指向主文件的指针出现于叶结点或非叶结点;
所有结点才能覆盖所有键值的索引;

散列索引

散列
有M个桶,每个桶是有相同容量的存储地(可以是内存页,也可以是磁盘块),散列函数 h(k),可以将键值k映射到 {0,1,…,M-1}中的某一个值,将具有键值k的记录Record(k)存储在对应h(k)编号的桶中。
目标:选择一个合适的散列函数,将一个Record集合(每个Record都包含一个关键字k)均匀地映射到M个桶中。即:对于集合中任一个关键字,经散列函数映射到地址集合中任何一个地址的概率是近乎相等的。

散列索引的目标:最好是没有溢出桶,每一个散列值仅有一个桶。读写每一个键值都只读写一个存储块。
均匀分布如何做到? 期望将所有数据分布均匀地存储于M个桶中,使每一个桶的数据成为具有某种特征值h(k)的数据集合。—散列函数的选择。
桶的数目M如何确定?在键值几倍于桶的数目时,每个散列值都可能多于一个桶,形成一个主桶和多个溢出桶的列表,此时需要二次检索:先散列找到主桶号,再依据链表逐一找到每个溢出桶。—桶的数目的确定。
桶的数目M是固定值----静态散列索引
如果桶的数目M不变:M过大,则浪费;M过小,则将产生更多的溢出桶,增加散列索引检索的时间。
桶的数目随键值增多,动态增加----动态散列索引
h(k)是和桶的数目M相关的。M的变化会否影响原来存储的内容呢?
是否需要将原来已经散列-存储的数据按新的桶数重新进行散列-存储呢?

可扩展散列索引

可扩展散列索引
为桶引入一间接层,即用一个指向块的指针数组来表示桶,而不是用数据块本身组成的数组来表示桶
指针数组能增长,其长度总是2的幂。因而数组每增长一次,桶的数目就翻倍。不过,并非每个桶都有一个数据块;如果某些桶中的所有记录可以放在一个块中,则这些桶可能共享一个块。
散列函数h为每个键计算出一个K位二进制序列,该K足够大,比如32。但是桶的数目总是使用从序列第一位或最后一位算起的若干位,此位数小于K,比如说i位。
问题
当桶数组需要翻倍时,要做大量的工作(当i很大时);
当桶数翻倍后,其在主存中可能就装不下了,或者要占用更大的空间
如果每块的记录数很少,那么很有可能某一块的分裂比在逻辑上需要的分裂时间提前很多。例如:块中存放2个记录,即使记录总数远小于220,但也可能出现三个记录的前20位二进制位序列一样,在这种情况下,将不得不使用i=20和100万个桶数组。

线性散列索引

桶数n的选择总是使存储块的平均记录数保持与存储块所能容纳的记录总数成一个固定的比例,例如80%。超过此比例,则桶数增长1块,分裂。 —线性增长,每次增1。
存储块并不总是可以分裂,所以允许有溢出块,尽管每个桶的平均溢出块数远小于1。
用来做桶数组项序号的二进制位数是log2n,其中n是当前的桶数。这些位总是从散列函数得到的位序列的右端(即低位)开始取。

数据库查询实现算法-I(一趟扫描算法)

数据库查询实现算法概述


连接操作的物理实现算法-表空间扫描法

基本实现算法P1
适用于任何情况:3块内存即可,但算法复杂性高: BR + BR *BS
全主存实现算法P2
要求内存能够完全装载两个关系。算法复杂性低: BR + BS
半主存实现算法P3
要求内存能够完全装载一个关系。算法复杂性低: BR + BS
大关系实现算法P4
适用于任何情况,尤其是大关系情况下比算法P1好。
算法复杂性低: BR(BS /(M-2)) + BS

利用迭代器构造查询实现算法

迭代器算法的基础
迭代器:迭代的读取一个集合中的每一个元素,而封装其读取细节。基于流水线计算策略。

数据库查询的一趟扫描算法

hash分桶

基于有序索引的连接算法,Zig-Zag连接算法

数据库查询实现算法-II(两趟扫描算法)

为什么需要两趟扫描算法

整个关系的一元操作 DISTINCT, GROUP BY,SORTING
理论上,任何一个元组需要与所有元组进行比较,才能确定是否重复,才能知道是否是一个新的组,才能确定位于何序位置?这些需要内存
如果需保存的待处理数据块数远远大于内存可用块数时?怎么办?
例如:内存只有8块,如何排序70块的数据集?如何针对70块的数据集进行去重复操作,进行分组操作?

两趟算法的基本思路
1、划分子集,并使子集具有某种特性,如有序或相同散列值等
2、处理全局性内容的操作,形成结果关系。如多子集间的归并排序,相同散列值子集的操作等
大数据集上的操作 可否 等于 (子集上操作)的并集?
例如:元组在某一子集上无重复即相当于在全集上无重复
多个已按横向处理的子集上,纵向归并结果等同于在全集上的处理结果?
例如:多个已排序的子集,纵向归并的结果等同于全集上的排序结果
多个已排序的子集,纵向归并处理的无重复即等同于全集上的无重复

两阶段多路归并排序

内排序问题:待排序的数据可一次性地装入内存中,即排序者可以完整地看到和操纵所有数据。内存中数据的排序算法:插入排序算法、选择排序算法、冒泡排序算法,…(可参阅《数据结构》《高级语言与程序设计》《算法设计与分析》
等课程学习相关内容)。
外排序问题:待排序的数据不能一次性装入内存,即排序者不能一次完整地看到和操纵所有数据,需要将数据分批装入内存分批处理的排序问题;
数据可划分为N个子集合,?使每个子集合的块数小于内存可用块数。每个子集合都可装入内存并采用内排序算法排好序并重新写回磁盘。

更大规模数据集的排序问题—多趟/多阶段
内存大小:3块
待排序数据: 30块
基本策略:
30块的数据集,10个子集合,每个子集合3块,排序并存储。
10个已排序子集合分成5个组:每个组2个子集合,分别进行二路归并,则可得到5个排好序的集合;
5个集合再分成3个组:每个组2个子集,剩余一个单独1组,分别进行二路归并,可得3个排好序的集合;再分组,再归并得到2个排好序的集合;再归并便可完成最终的排序

基于排序的两趟扫描算法

基于排序的连接运算:
第一趟:划分R和S的子表并进行子表排序,排序均基于Y属性排序。
第二趟:归并时注意是R的输入还是S的输入。R和S的两路输入之间进行连接检查并连接后输出。

基于散列的两趟扫描算法

大数据集上的操作 可以被转换为某个子集上的操作
第一趟:散列子表。用散列函数hp将原始关系划分成M-1个子表,并存储
第二趟:处理每个子表用另一散列函数hr将子表读入内存并建立内存结构,进行不同操作的处理
散列函数随操作的不同而有不同的选择

基于散列的连接操作
以连接属性Y作散列关键字,设计散列函数。
第一趟:使用相同散列函数散列两个操作对象R和S,形成R1,…,RM和S1,…,SM,
第二趟:将Si再整体散列读入到内存中,再依次处理Ri的每一块。进行连接。

数据库查询优化技术

三个层面进行优化:
语义优化:利用模型的语义及完整性规则,优化查询。
语法优化—逻辑层优化:利用语法结构,优化操作执行顺序;
执行优化—物理层优化:存取路径和执行算法的选择与执行次序优化;

查询优化的总体思路

语法优化(逻辑层优化)—语法等价性
基本思想:改变关系代数的操作次序:尽可能早做选择和投影运算
关系代数的五种基本操作中哪两个能够交换次序呢?
次序改变前后两个表达式的等价性问题
关系代数表达式的优化算法?–逻辑查询计划形成

执行优化(物理层优化)
获取数据库的相关信息,从实现同一关系操作的不同例行程序库,选取相应的执行层例行程序,依据相关信息进行代价估算,并选择代价最少的例行程序及确定相应的参数,形成查询计划:以基本的例行程序为基本,确定这些例行程序的执行顺序,形成物理查询计划。

用语法树表达关系代数表达式

逻辑优化策略

(1)尽可能地早做选择和投影:可使中间结果变小,节省几个数量级的执行时间。
(2)把选择与投影串接起来:一元运算序列可一起执行,只需对整个关系扫描一遍。
(3)把投影与其前或后的二元运算结合起来:在第一次用关系时去掉一些无关属性,可以避免多次扫描整个关系。
(4)把某些选择与其前的笛卡尔积合并成一个连接:当R×S前有选择运算且其中有条件是R、S属性间比较的运算时,可将其转化为连接运算可节省时间。
(5)执行连接运算前对关系做适当预处理:文件排序、建立临时索引等,可使两关系公共值高效联接。
(6)找出表达式里的公共子表达式:若公共子表达式结果不大,则预先计算,以后可读入此结果。

关系代数操作次序交换的等价性

并运算、交运算、连接与连接,积与积的交换律,连接与连接、积和积的结合律,投影串接律,选择串接律,选择和投影交换律,选择和积的交换律,投影和积的交换律,选择和并的交换律,选择和差的交换律,投影和并的交换律

物理层查询优化 代价估算

DBMS如何衡量物理查询计划的优劣呢?
依据数据库的一些统计信息(存放在数据字典或系统目录中的),衡量I/O访问次数,衡量CPU的占用时间,内存使用代价(与缓冲区数目与大小的匹配),中间结果存储代价,计算量(如搜索记录、合并记录、排序记录、字段值的计算等),网络通信量。

数据库事务处理技术 并发控制


ACID
数据库事务中ACID特性的含义:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
ACID强调的是强一致性,要么全做,要么全不做,所有的用户看到的都是一致的数据。传统的数据库都有ACID特性,它们在CAP原理中,保证的是CA。

事务调度与可串行性

事务调度(schedule):一组事务的基本步(读、写、其他控制操作如加锁、解锁等)的一种执行顺序称为对这组事务的一个调度。
并发(或并行)调度:多个事务从宏观上看是并行执行的,但其微观上的基本操作(读、写)则是交叉执行的。
并发调度的正确性:当且仅当在这个并发调度下所得到的新数据库结果与分别串行地运行这些事务所得的新数据库完全一致,则说调度是正确的。
可串行性:如果不管数据库初始状态如何,一个调度对数据库状态的影响都和某个串行调度相同,则我们说这个调度是可串行化的(Serializable)或具有可串行性(Serializability)
冲突:调度中一对连续的动作,它们满足:如果它们的顺序交换,那么涉及的事务中至少有一个事务的行为会改变。
有冲突的两个操作是不能交换次序的,没有冲突的两个事务是可交换的
冲突可串行性: 一个调度,如果通过交换相邻两个无冲突的操作能够转换到某一个串行的调度,则称此调度为冲突可串行化的调度。

冲突可串行性判别算法

冲突可串行性判别算法
构造一个前驱图(有向图),结点是每一个事务Ti。如果Ti的一个操作与Tj的一个操作发生冲突,且Ti在Tj前执行,则绘制一条边,由Ti指向Tj,表征Ti要在Tj前执行。测试检查:如果此有向图没有环,则是冲突可串行化的!

基于封锁的并发控制方法

封锁协议之锁的类型
排他锁X(exclusivelocks)
只有一个事务能读、写,其他任何事务都不能读、写
共享锁S(sharedlocks)
所有事务都可以读,但任何事务都不能写
更新锁U(Updatelocks)
初始读,以后可升级为写
增量锁I(Incrementallock)
增量更新(例如A=A+x),区分增量更新和其他类型的更新

隔离级别
链接: 数据库事务隔离级别(脏读、幻读、不可重复读).
MySQL在处理事务隔离和并发之间的矛盾上提供了四种事务的隔离级别:
未提交读(Read uncommitted):
最低级别,只能保证不读取物理上损坏的数据。两个事务,其中一个事务对数据做的DML操作还未提交,另一个事务能够立即看到。脏读、不可重复度和幻读均不可避免。
已提交读(Read committed):
可以避免脏读的发生,是语句级别的。两个事务,其中一个事务对数据做的DML操作提交后,另一个事务才能看到。可避免脏读,不可重复度和幻读不可避免。
可重复读(Repeatable read):
可以避免脏读和不可重复读的发生,是事务级别的。两个事务,其中事务A获取一条数据,事务B在事务A提交事务前无法操作这条数据,这样就保证了可以重复读(即数据库加了读锁)。但是这样还是会产生幻读现象。
可序列化(Serializable):
最高级别,事务级别,可避免脏读、不可重复读、幻读的发生。两个事务完全独立,其中一个事务做的操作,对于另外一个事务不产生任何影响(数据库事务加了锁,所有事务串行执行)。可以避免上述所有问题,但是性能上影响很大。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式,使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。

两段封锁协议(2PL)
读写数据之前要获得锁。每个事务中所有封锁请求先于任何一个解锁请求
两阶段:加锁段,解锁段。加锁段中不能有解锁操作,解锁段中不能有加锁操作

基于时间戳的并发控制方法

事务的时间戳
事务T启动时,系统将该时刻赋予T,为T的时间戳
时间戳可以表征一系列事务执行的先后次序:时间戳小的事务先执行,时间戳大的事务后执行。
利用时间戳,可以不用锁,来进行并发控制
借助于时间戳,强制使一组并发事务的交叉执行,等价于一个特定顺序的串行执行。
特定顺序:时间戳由小到大。
如何强制:执行时判断冲突,如无冲突,予以执行;如有冲突,则撤销事务,并重启该事务,此时该事务获得了一个更大的时间戳,表明是后执行的事务。

另一种调度规则
托马斯写规则:过时的写操作可直接被忽略,而无需撤销过时的事务

对DB中的每个数据元素x,系统保留其上的最大时间戳
RT(x): 即R-timestamp(x)
读过该数据事务中最大的时间戳,即最后读x的事务的时间戳。
WT(x): 即W-timestamp(x)
写过该数据事务中最大的时间戳,即最后写x的事务的时间戳。
C(x): x的提交位。
该位为真,当且仅当最近写x的事务已经提交。
C(x)的目的是避免出现事务读另一事务U所写数据然后U终止这样的情况。

调度器可以:
同意请求
撤销/终止T,并重启具有新时间戳的T(终止+重启,被称回滚)
推迟T,并在以后决定是终止T还是同意请求(如果请求是读,且此读可能是脏的)
假设调度器收到提交T的请求。它必须找到T所写的所有数据库元素x,并置C(x):=true。如果有任何等待x被提交的事务,这些事务就被允许继续进行。
假设调度器收到终止T的请求。像前述步骤一样确定回滚T。那么任何等待T所写元素x的事务必须重新尝试读或写,看这一动作现在T的写被终止后是否合法。

基于有效性确认的并发控制方法

基于有效性确认的并发控制的思想
事务在启动时刻被赋予唯一的时间戳,以示其启动顺序。
为每一活跃事务保存其读写数据的集合,RS(T):事务T读数据的集合;WS(T):事务T写数据的集合。
通过对多个事务的读写集合,判断是否有冲突(存在事实上不可实现的行为),即有效性确认,来完成事务的提交与回滚,强制事务以可串行化的方式执行。

事务分三个阶段进行
读阶段。事务从数据库中读取读集合中的所有元素。事务还在其局部地址空间计算它将要写的所有值;
有效性确认阶段。调度器通过比较该事务与其它事务的读写集合来确认该事务的有效性。
写阶段。事务往数据库中写入其写集合中元素的值。

调度器维护三个集合
START集合。已经开始但尚未完成有效性确认的事务集合。对此集合中的事务,调度器维护START(T),即事务T开始的时间。
VAL集合。已经确认有效性但尚未完成第3阶段写的事务。对此集合中的事务,调度器维护START(T)和VAL(T),即T确认的时间。
FIN集合。已经完成第3阶段的事务。对这样的事务T, 调度器记录START(T),VAL(T)和FIN(T),即T完成的时间。

(1)对于所有已经过有效性确认,且在T开始前没有完成的U,即对于满足FIN(U)>START(T)的U,检测:RS(T)交WS(U)是否为空。若为空,则确认。否则,不予确认。
(2)对于所有已经过有效性确认,且在T有效性确认前没有完成的U,即对于满足FIN(U)>VAL(T)的U,检测:WS(T)交WS(U)是否为空。若为空。

数据库事务处理技术 故障恢复

数据库的故障及其影响

事务故障
某一个程序(事务)自身运行错误所引起的故障,影响该程序(事务)本身
系统故障
由于掉电、非正常关机等所引起的故障,影响正在运行的事务以及数据库缓冲区,数据库缓冲区将涉及正在运行和已经运行的事务
介质故障
由于介质损坏等所引起的故障,影响是全面的,既影响内存中的数据,又影响介质中存储的数据

数据库故障恢复
把DB由当前不正确状态恢复到已知为正确的某一状态。
需要保证事务的:
原子性:事务的所有操作,要么全都执行,要么全都不执行。
持久性:已提交的事务对数据库产生的影响是持久的,未提交的事务对数据库不应有影响。
事务故障的恢复
事务故障可通过重做事务(Redo)和撤消事务(Undo)来恢复。重做事务可保证已提交事务的持久性,而撤销事务则消除未提交事务的影响。

运行日志(System Log)
运行日志是DBMS维护的一个文件,该文件以流水方式记录了每一个事务对数据库的每一次操作及操作顺序
运行日志直接写入介质存储上,会保持正确性当事务对数据库进行操作时:先写运行日志;写成功后,再与数据库缓冲区进行信息交换

系统故障可通过运行日志来恢复
按照运行日志记录的事务操作顺序重做事务(当事务在发生故障时已正确结束)或撤消事务(当事务在发生故障时未结束)。但故障恢复是需要时间的,运行日志保留了若干天的记录,当发生系统故障时应从哪一个点开始恢复呢。

DBMS在运行日志中定期的设置和更新检查点(checkpoint)
检查点是这样的时刻:在该时刻,DBMS强制使内存DBBuffer中的内容与介质DB中的内容保持一致,即将DBBuffer更新的所有内容写回DB中,检查点表征了:在检查点之前内存中数据与介质中数据是保持一致的,系统故障的恢复检查点之前结束的事务不需要恢复(已经写回DB),检查点之后结束或发生的事务需要依据运行日志进行恢复(不能确定是否写回DB):故障点前结束的重做,故障点时刻未结束的撤消。

介质故障恢复
副本(Copy)
在某一时刻,对数据库在其他介质存储上产生的另一份等同记录,用副本替换被损坏的数据库。
介质故障的恢复
用副本替换被破坏的数据库,由于介质故障影响全面,在用副本恢复后还需要依据运行日志在转储点后进行恢复。

三种日志

缓冲区处理策略
Force:内存中的数据最晚在commit的时候写入磁盘。
No steal:不允许在事务commit之前把内存中的数据写入磁盘。
No force:内存中的数据可以一直保留,在commit之后过一段时间再
写入磁盘。(此时在系统崩溃的时候可能还没写入到磁盘,需要Redo)。–
灵活
Steal:允许在事务commit之前把内存中的数据写入磁盘。(此时若系统在commit之前崩溃时,已经有数据写入到磁盘了,要恢复到崩溃前的状态,需要Undo)。–灵活

静止检查点:周期性地对日志设置检查点
停止接受新的事务,等到所有当前活跃事务提交或终止,并在日志中写入了COMMIT或ABORT记录后
将日志刷新到磁盘,写入日志记录,并再次刷新日志
非静止检查点
在设置检查点时不必关闭系统,允许新事务进入
写入一条<START?CKPT(T1,…,Tk)>,其中T1,…,Tk是所有活跃的未结束的事务
继续正常的操作,直到T1,…,Tk都完成时,写入

Undo型日志
对于任一事务T,按下列顺序向磁盘输出T的日志信息:
首先,<T,X,v>被写到日志中
其次,OUTPUT(X)
最后,或被写到日志中

从日志的尾部开始按日志记录的反序,处理每一日志记录,撤销未完成事务的所有修改。
Redo型日志
对于任一事务T,按下列顺序向磁盘输出T的日志信息:
首先,<T,X,v>被写到日志中
其次,被写到日志中
最后,OUTPUT(X)

从日志的起始位置开始按日志记录的正序处理每一日志记录,重做已提交事务的所有修改

Undo/Redo型日志
与undo型和redo型的差别,在后两步。Redo型是先写提交记录后输出;undo型是先输出,再写提交记录;undo/redo型则无所谓谁先谁
后。
自前向后地,按日志记录的正序,重做所有已提交的事务;自后向前,按日志记录的反序,撤销所有未完成事务的所有修改。先做<撤销>,再做<重做>。

数据库管理系统实现技术相关推荐

  1. 数据库管理系统属于计算机应用,数据库管理系统是否属于应用软件

    数据库管理系统是否属于应用软件 发布时间:2020-07-22 11:13:59 来源:亿速云 阅读:238 作者:Leah 数据库管理系统是否属于应用软件?很多新手对此不是很清楚,为了帮助大家解决这 ...

  2. mysql是系统软件吗_数据库管理系统属于应用软件吗? MySQL数据库使用教程

    不属于,数据库管理系统属于系统软件.系统软件主要包括:操作系统.语言处理程序.数据库管理系统和服务程序等:而应用软件是为完成某种特定工作,解决一些具体问题而编写的程序,比如杀毒软件.办公软件等都属于应 ...

  3. 数据库技术基础:数据库管理系统的功能介绍笔记

    1.DBMS功能介绍 1.1 数据定义 数据库定义语言(DDL):可以对数据库结构描述,包括外模式.模式.内模式的定义:数据库完整性定义:安全保密定义比如口令.级别和存取权限.这些定义存储在数据字典中 ...

  4. 数据库技术基础:数据库与数据库管理系统概念介绍

    一.数据库系统基本概念知识 1. 数据(Data) 用来描述事物的符号记录,它具有多种表现形式比如文字.图形.图像.视频等. 信息:是现实事物的存在方式或状态的反映.信息的特性有可感知.可存储.可加工 ...

  5. UI一揽子计划 19 (数据库管理系统、SQL语句、iOS 的数据库实现技术)

    一.数据库管理系统 1. 以一定的方式存储在一起; 2. 能为多个用户共享 3. 具有尽可能小的冗余度 4. 与程序彼此独立的数据集合 二.SQL语句 SQlite常用语句 注:SQlite语句 不区 ...

  6. 顶级数据库管理系统的性能比较研究(论文翻译)

    本文译自 <A Comparative Study on the Performance of the Top DBMS Systems >Youssef Bassil LACSC – L ...

  7. mysql 不同的文件系统_文件系统,数据库管理系统,操作系统之间有什么联系?...

    这仨名字里都有个"系统",但完全不是一个东西,也谈不到谁包含谁的问题. 简单的说他们之间的关系:文件系统和操作系统可以看作一种"合作"关系,而数据库管理系统则是 ...

  8. [精华] 数据库的查询优化技术

    数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行.企业.政府等部门最为重要的计算机应用之一.从大多数系统的应用实例来看,查询操作在各种数据库操作中 ...

  9. 04--MySQL自学教程:数据库MySQL--【数据库DB】和【数据库管理系统DBMS】简介

    1.数据库DB 数据库:DB(DataBase) 按照一定规则存储在计算机的内部存储设备上被各种用户或者应用共享的数据集合 2.数据库管理系统DBMS 1)数据库管理系统DBMS:DBMS(DataB ...

最新文章

  1. Java深入了解String对象
  2. K-Means原理解析
  3. 【多线程】ThreadPoolExecutor类源码解析----续(二进制相关运算)
  4. flink启动命令参数_Flink集群部署
  5. 大姐,你是不是得了尿频?
  6. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
  7. 关于C语言中继承和多态的实现
  8. 目前效果最好、应用较广且比较成熟的语音识别模型是什么?
  9. 汇编语言项目创建指南 - Visual Studio
  10. Linux设置小红点键盘,debian linux上安装thinkpad小红点驱动/Installing Debian On Thinkpad – Trackpoint...
  11. CH582 BLE 5.0 使用 LE Coded 广播和连接
  12. Java报表导出有哪些技术_报表工具能实现怎么的导出效果?
  13. Python宣传自己很快的orjson真的比ujson快吗(orjson与ujson速度比较)
  14. 给实体机服务器重装Linux系统全记录
  15. C++ini文件操作
  16. 知帆科技创始人叶茂: 链上数据分析将大有作为
  17. 第7关:求解一元二次方程
  18. 基于域的无线安全认证方案
  19. 【Orangepi Zero2 全志H616】语音刷抖音 / 手机连接Linux热拔插相关
  20. 使用CSS3动画做出光芒万丈的效果

热门文章

  1. Windows Mobile 开发
  2. 【LaTeX】 案例分析 (10) - 高等数学分析(下) Mathematica 实验报告
  3. 高校房产管理—周转房、经营性房产管理分析
  4. 2023-05-29 用 fltk gui库编写一个打字练习程序
  5. 金蝶KIS旗舰版盘点机PDA,销售出库单扫码校验,出库扫码校验核对,金蝶生产管理软件,金蝶仓库条码管理
  6. 深圳学区房购买-查查吧深圳学区地图
  7. 【电商】通过商品流转了解系统模块组成
  8. 企业微信开发实战(一、相关说明及注册企业微信)
  9. 第十四届蓝桥杯三月真题刷题训练——第 8 天
  10. 虚拟私有云服务器,虚拟私有云服务器