数据库原理及应用【四】数据库管理系统

查询优化

数据库管理系统中非常重要的一部分。

代数优化

按照一定的规则将语句变化成关系代数以后进行优化

操作优化

对代数优化后的查询树使用比较好的方法进行查询。
主要是对连接运算进行优化

  • 嵌套循环
  • 归并扫描
  • 索引优化
  • 哈希连接

恢复机制

备份(完整备份+差异备份)+日志

事务

  • A:原子性
  • C:保持一致性
  • I:隔离性
  • D:持久性

事务的特性由DBMS负责维护,因此对于需要使用事务来进行执行的SQL语句,我们要定义在事务中。

如果没有显式地创建事务,那么DBMS会把每一条语句当作一个事务。

恢复信息

日志存储在非挥发存储器中。

  • Commit list:已经提交的TID的列表
  • Active list:进程中的TID列表
  • Log:更新前和更新后的信息。存储的是修改前后的物理块的值

提交(commit)规则:在提交事务之前修改后的数据A.I必须写到非挥发存储器中

先记后写(log ahead)规则:在修改数据前必须把被修改数据的旧值B.I写到日志中

操作:

  • 还原undo
  • 重做redo
    这两种操作具有幂等性:一次和和好多次是相等的

更新策略

A.I->DB before commit

TID->active list

B.I->Log
A.I->DB

TID->commit list
delete TID from active list
如果发生故障会启动重启动恢复:检查TID目前所处的状态

Commit listActive listOperation
NoYesundo,delete TID from active list
YesYesdelete TID from active list
YesNonothing to do

为了避免每次检查都需要检查所有的TID,使用检查点。
检查点(check point):运行一段时间以后进行一次检查,并且设立一个检查点。每次检查检查上一次检查点以后的TID

A.I->DB after commit

TID->active list

A.I -> Log

TID->commit list
ALL:A.I -> DB
delete TID from active list

重启动恢复:

Commit listActive listOperation
NoYesdelete TID from active list
YesYesredo, delete TID from active list
YesNonothing to do

这种策略的并发度更高。可以推迟加排他锁的时间。

A.I -> DB concurrently with commit

TID -> active list

A.I,B.I -> log

A.I->DB(partially done by 后台进程 when hard disk is free)

TID->commit list
A.I->DB(completed)
delete TID from active list

重启动恢复:

Commit listActive listOperation
NoYesundo, delete TID from active list
YesYesredo, delete TID from active list
YesNonothing to do
总结
redoundo
A.I->DB before commitNoYes
A.I->DB after commitYesNo
A.I->DB concurrently commitYesYes
异地更新(有缺点,没有被推广)NoNo

并发控制

并发:支持多个事务同时访问数据库
原因:

  • 改善系统的利用率
  • 不同的事务很可能访问的是不同的数据,互不冲突

并发控制:对事务的并发运行加以管理

任意并发的后果:

  • 丢失更新:写-写冲突
  • 读脏数据->恢复时的多米诺现象:写-读冲突
  • 不可重复的读:读-写冲突

可串行化:并发运行事务以后的结果如果和某种串行运行的结果相同,则说这种并发运行是可串行化的,即是正确的。

如果用户把一些事务同时提交并发运行,则要求这些事务谁先运行后运行是无所谓的,即默认所有可串行化的结果都是正确的。

并发控制策略

通过并发控制使得并发事务的运行是可串行化的

封锁法

通过锁对事务强行串行化

  • X锁协议(排他锁)

定义1:在一个事务里面,如果所有的加锁请求都在锁释放之前,称这个事务是一个两阶段事务,符合两阶段加锁协议。(增长阶段-缩减阶段)
定义2:先得到锁再访问数据对象,那么这个事务就是well-formed(合式的)
定义:如果每个事务是合式的两阶段事务,那么这些事务一定是可串行化的。
如果事务是合式的并且是两阶段事务,并且在事务结束的时候释放更新锁,那么这个事务是可串行化的、可恢复的。不会出现恢复的时候的多米诺效应
如果在事务结束的时候释放所有的锁,那么称这个事务满足严格的两阶段加锁协议。

NLX
NLYY
XYN

数据库效率比较低。

  • SX锁协议
    S(hare) lock :如果是读操作
    X lock:如果是更新操作
NLSX
NLYYY
SYYN
XYNN
  • S(share)U(update)X locks
NLSUX
NLYYYY
SYYYN
UYYNN
XYNNN

系统的并发度较高。

死锁/活锁(饥饿)
在这里插入图片描述
活锁/饥饿:优化调度策略

死锁:
  • 防:防止出现死锁
  • 治:出现死锁以后能够解决死锁。
治:
  • 当事务获得锁以后的等待时候超过一个限度以后就判定已经发生了死锁,就重启事务。对于时间的设置影响系统的运行效率
  • 构造等待图
    节点:等待的事务
    边:等待关系
    如果在等待图里面出现环就说明出现死锁。

检查时机:每次出现新的等待关系的时候/周期检查
解决方法:选择一个牺牲者(目前拥有锁最小的/滚回代价最小的事务)。然后等待环路上的其他事务都运行结束以后再运行该事务。

操作系统中的解决方案:

  • 检查所需要的所有资源
  • 给资源进行排序

在数据库系统中不现实

多粒度加锁

  • 一旦遇到得不到锁就终止,不等待就不会死锁
  • 事务重试:给每一个事务安排一个时间戳
    • 当作TID
    • 比较两个事务的年龄

等待死亡协议
如果Ta需要申请一个锁,这个锁已经被Tb占领了:

  • 如果Ta比Tb年老,则Ta进行等待
  • 如果Ta比Tb年轻,则自己终止,然后自动重新运行(以原来的时间戳)

因此不可能重现循环等待,解决了死锁和活锁问题
受伤等待协议
如果Ta需要申请一个锁,这个锁已经被Tb占领了:

  • 如果Ta比Tb年轻,则Ta进行等待
  • 如果Ta比Tb年老的话,则将Tb终止

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

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

相关文章

递归式复杂度求解

代换法 猜测复杂度验证是否满足递归式(使用归纳法)找到常数应该满足的条件针对基本情况,常数足够大时总是成立的 需要注意的是,我们猜测的复杂度有可能不满足递归式,这个时候就要通过减去一些低阶项来使得归纳成立。…

P、NP、NP完全问题、NP难问题

可以在多项式时间内求解的问题称为易解的,而不能在多项式时间内求解的问题称为难解的。 P类问题:多项式类型,是一类能够用(确定性的)算法在多项式的时间内求解的判定问题。 只有判定问题才属于P 不可判定问题&#…

数据可视化【十】绘制地图

Loading and parsing TOPOJSON 导入Topojson d3文件 地址:https://unpkg.com/topojson3.0.2/dist/topojson.min.js 想要找d3文件的话去unpkg.com好像大部分都能找到的样子 Rendering geographic features 寻找合适的地图数据:谷歌搜索world-atlas npm…

数据可视化【十一】树状图

Constructing a node-link tree visualization 首先将节点之间的连线画出来。 使用json函数读取文件以后,使用hierarchy等函数得到连线的数组,然后绑定这个数组,给每个元素添加一个path,绘画使用的是一个函数linkHorizontal&…

数据可视化【十二】 颜色图例和尺寸图例

有了前面的知识,制作一个图例应该不是很难,关键是我们想要制作一个可以在其他地方进行使用的图例,这样就需要能够动态地设置图例的大小,位置,等等。 这里直接上代码: colorLegend.js export const color…

数据可视化【十三】地区分布图

在前面的博客中已经介绍了如何绘制地图,这一节学习如何绘制地区分布图。如果对绘制地图还不熟悉的话可以了解一下之前我写的博客:数据可视化【十】绘制地图 Intergrating(整合) TopoJSON with tabular data(列表数据) 在前面的博客中没有使用到tsv文件…

数据可视化【十四】交互式过滤地区分布图

在前面的博客中已经介绍了如何绘制地区分布图,这一节学习如何绘制交互式过滤地区分布图。如果对绘制地区分布图还不熟悉的话可以了解一下之前我写的博客:数据可视化【十三】地区分布图 整体的框架仍然是在之前的基础上进行修改,主要是添加交…

Ubuntu环境搭建

本文记录了一些常用的Ubuntu软件 然后首先修改软件源:软件和更新->Ubuntu软件->下载自:其他站点(修改为阿里云) 在关闭的时候需要更新什么的 然后修改更新方式,将不支持的更新去掉 常用的Windows软件 网易云…

Ubuntu修改/删除主目录下的中文文件夹

在Ubuntu的主目录下一般是有一些中文的目录,例如桌面,视频等等,还无法修改名称,在一群英文文件夹里面显得有些突兀(Ubuntu终端下的中文一点也不好看),就想把这些文件夹修改一下,结果…

每日一题:leetcode1489. 找到最小生成树里的关键边和伪关键边

时隔多年我终于又开始写博客了,主要是已经放假了,之前一直忙于考试和课设没有时间写博客,学习笔记也因为买了iPad的缘故大部分都是手写的了。 假期想要把以前做过的项目都整理一下放在github和CSDN上。 也已经很久没有写算法题了&#xff0…

每日一题:leetcode989.数组形式的整数加法

题目描述 题目分析 题目非常简单&#xff0c;但是我还是wa了几发&#xff0c;对不起&#xff0c;我太菜了。我的想法是把K转换为数组然后用大整数加法处理。但是因为太久没有写了导致写了好久。 class Solution { public:void add(vector<int> &A, vector<int&g…

每日一题:leetcode674.最长连续递增序列

题目描述 题目分析 一遍遍历&#xff0c;如果硬要说用了什么算法的话觉得应该算是一个简单的滑动窗口吧 AC代码 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() 0) {return 0;}int ret 1;int cnt 1;for (int i 1; i <…

每日一题:leetcode959.由斜杠划分区域

题目描述 题目分析 仔细分析这道题以后虽然觉得可能要转化为图之类的&#xff0c;但是完全没有具体的想法&#xff0c;因为每个格子都有三种情况&#xff0c;这三种情况的不同的组合又会产生不同的结果。 发现找不到编码转化为图以后&#xff0c;我分析了一下不同数量方块之间…

每日一题:leetcode1319.联通网络的操作次数

题目描述 题目分析 ps&#xff1a;这篇博客是补前天的&#xff0c;前天在老家不方便写博客 题目挺简单的&#xff0c;但是通过题目对图的连通性有了一个更深刻的认识&#xff1a;如果有超过&#xff08;或等于&#xff09;n-1条边&#xff0c;则一定是可以让整个图联通的。 如…

每日一题:leetcode1128.等价多米诺骨牌对数

题目描述 题目分析 看到题目以后第一个想法是遍历数组&#xff0c;对每个元素有一个数据结构中保存了该元素出现的次数&#xff0c;然后往结果中相加&#xff08;表示该元素和前面的对数&#xff09;&#xff0c;然后再将元素出现的次数加一。 思考用什么数据结构保存元素出现…

每日一题:leetcode1579.保证图可完全遍历

题目描述 题目分析 非常惭愧&#xff0c;感觉自己有点畏难心理&#xff0c;看到是困难题第一个想法是自己想不出来。。。 因为自己认为自己做不出来&#xff0c;所以完全不能进行思考&#xff0c;稍微思考一下就觉得不行不行。 我也想到了分别用两个并查集判断各自可以去掉多少…

每日一题:leetcode724.寻找数组的中心索引

题目描述 题目分析 今天这道题原本很简单&#xff0c;我都没打算写题解&#xff0c;当时用手机看的题目&#xff0c;我想着我三分钟应该能写出来&#xff0c;结果没想到wa了三发。。。 对待简单题不要轻视&#xff0c;对待难题不要畏难。 今天的主要问题是没有看数据范围&…

z3 C++学习笔记

因为项目需要使用z3库来解决问题&#xff0c;所以自己学习了一下&#xff0c;结果发现网上教程比较少&#xff0c;而且大部分都是使用Python&#xff0c;而我本人是C的忠实信徒&#xff0c;在知道C也可以使用z3库以后我毫不犹豫地着手用C使用z3&#xff0c;但是我很快发现&…

每日一题:leetcode191.位1的个数

题目描述 题目分析 很自然地想到了二进制枚举&#xff0c;直接循环检查每一个二进制位。 class Solution { public:int hammingWeight(uint32_t n) {int ret 0;uint32_t t 1;for (int i 0; i < 32; i, t << 1) {if (n & t) {ret;}}return ret;} };AC之后看了…

每日一题:leetcode341.扁平化嵌套列表迭代器

题目描述 题目分析 这个题目自己大概花了一个小时&#xff0c;虽然是一遍AC&#xff0c;但是速度有点慢&#xff0c;太长时间不写代码导致自己对代码不太敏感&#xff0c;写起来慢腾腾的。 看到这个的想法就是&#xff0c;要用栈来保存列表的迭代器&#xff0c;这样将孩子列表…