美文网首页
数据库-并发调度(未完结)

数据库-并发调度(未完结)

作者: __晨风__ | 来源:发表于2019-12-28 17:29 被阅读0次


数据库-并发调度(未完结)

数据库

• 数据库的并发调度

由于数据库中的数据具备共享性,所以数据库中的数据就支持了多个用户的访问

• 并发调度

• 串行

串行:是指在单核CPU上,有多个事务T1、T2、T3。。。。需要被执行,则此时CPU会按照事物的优先级来顺序执行,即:T1执行完毕,T2执行,T3执行。。。。依次类推

• 并发

• 并发的产生

为了解决串行对系统资源利用率不高的情况,并发思想产生;比如:在串行的时候,T1事物执行完毕,T2再去执行。就会在同一时刻,CPU、IO可能不会被充分利用

• 什么是并发

并发是指:在单核CPU上,T1、T2、T3。。。。事物被随机调度,交叉执行,是因为操作系统的CPU分时调度原理。但是,在任一时刻,只有一个事物被CPU执行,也即就是说并非真正意义上的并发

• 并发带来的问题

比如:T1先执行,执行到一半,T2再执行,执行到一半,T1再执行,就可能会带来一定的问题;

• 数据不一致

• 丢失修改

一个事物的修改覆盖了另外一个事物的修改;T1写事物、T2写事物。

• 不可重复读

T1读事物、T2写事物;T1读的过程中,T2写数据,T1再次读的时候,发现两次读的数据不一致;即:两次读的过程中,出现了写操作。由于写的不同:T1读,T2 更新,T1再次读; T1读,T2 插入,T1再次读;--幻读 T1读,T2 删除 , T1再次读;--幻读

• 幻读

幻读:就是说T1事物再两次读的过程中,T2事物做了插入或者删除操作。那么T1两次读的结果,一会有值,一会没有值。这种现象称为幻读T1读,T2 插入,T1再次读;--幻读T1读,T2 删除 , T1再次读;--幻读

• 脏读

T1写事物,T2读事物;T1写事物,未提交。T2开始读,T1回滚,T2再次读,数据不存在。

• 如果解决并发产生的问题

为了保证多个事物的隔离性

• 并发控制(DBMS提供的机制)

• 封锁

一种悲观的技术:冲突总在发生、为了避免冲突,所以采用封锁技术;银行通常使用悲观的封锁方式,主要是因为银行主要发生更改的操作;即:访问数据库对象之前,必须先加锁,使用完毕,释放锁

• 封锁类型

• 排他锁(X锁)

当T1对数据库做更新时,必须获得排他锁(写锁),此时,T2也对数据库同一对象进行写操作时,会获取锁失败

• 共享锁(S锁)

当对数据库对象做读操作时,必须获得共享锁

• 排他锁-共享锁符合相容矩阵原理

即只有共享锁和共享锁是不冲突的

• 活锁-死锁

• 活锁

活锁:有T1、T2、T3。。。多个事物,T1首先获得R1的锁,T2、T3....都需要等待,等到T1释放了锁之后,由于操作系统的分时调度机制,此时T3被唤醒,T3此时获取到了R1的锁,等T3释放了锁之后,T4又被唤醒,这个时候,T2一直获取不到锁。这种现象就是活锁,活锁并非死锁。解决办法:事先只需要将T1,T2、T3。。。。放入到队列当中,保证了事物的执行顺序,即先来先获取。这样就会避免了T2事物一直处于等待状态而获取不到锁的情况

• 死锁

1,T1已经获得了R1的锁;2,T2开始执行,并获得了R2的锁;3,T1继续执行,并想要获取R2的锁,由于T2已经占有了R2的锁,T1获取R2失败,并处于等待当中;4,T2开始继续执行,并同时想要获取R1的锁,由于T1已经占有了R1的锁,则T2获取R1失败,并处于等待当中;5,T1开始被唤醒,继续3步骤的操作,结果等待6,T2开始被唤醒,继续4步骤的操作,结果等等7,依次类推。。。互相等待,进入了死循环

• 解决方案

数据库系统的解决方案:一次封锁法;顺序封锁;死锁诊断

• 一次封锁法

即就是:T1事物事先将其需要的锁全部占有。此方法缺点:并发度会降低,其次事先获取到需要全部的锁,这个维度不好把控,会导致

• 顺序封锁

事先将需要封锁的对象排序,然后按照顺序进行封锁缺点:如果T1执行的顺序和封锁对象已排好的顺序不一致时,则同样会增加并发度

• 死锁诊断

• 超时法(商用操作系统使用最多的方式)

事先设置一个超时阈值,当一个事物执行时间超过阈值,则认为是死锁。此时就会回滚该事物,则将其占有的锁释放;缺点:会出现误判;阈值的设置不好把控;

• 等待图(可以精确的监测死锁)

有向图(包括:节点和有向边)即就是:节点代表所有的事物,有向边:表示事物和其他事物之间关系;执行机制:系统周期性的去监测这个有向环,如果出现有向环,则系统会打破这个有向环,即就是回滚有向环当中的一个事物;到底回滚哪一个事物,这个时候系统会根据事物的执行代价来判断,比如:该事物如果执行很久,快要结束了,则不会回滚该事物;而是去监测,执行时间很短的事物,优先释放

• 时间戳(乐观)

乐观认为冲突并不常发生,认为加锁的开销会很大。发现冲突,那么在事物执行完毕再计算。比如:回滚

• 并行

由于多核CPU的发展,出现了真正意义上的并行事物,即:同一时刻,会在不同CPU上执行不同的事物,从而达到真正意义上的并行

相关文章

  • 数据库-并发调度(未完结)

    数据库 • 数据库的并发调度 由于数据库中的数据具备共享性,所以数据库中的数据就支持了多个用户的访问 • 并发调度...

  • xxl_job的调度线程池

    5.4.3 调度中心HA(集群) 基于数据库的集群方案,数据库选用Mysql;集群分布式并发环境中进行定时任务调度...

  • 2019-03-20

    1. go的并发调度模型? go的并发调度模型可以简称为GPM模型,其中G代表goroutine,P代表gorou...

  • RxSwift文档五(Schedulers)

    代码下载 Schedulers 串行与并发调度程序 自定义调度程序 内置调度程序 Schedulers抽象出执行工...

  • Go并发调度

    本文是《循序渐进Go语言》的第六篇-Go并发调度。本文是学习《Go语言学习笔记》的并发调度一章,然后结合阅读源码的...

  • 常用调度算法简介

    常用调度算法简介 一、关于调度 进程调度用于多进程或者多线程并发访问资源。 进程调度的需求出现在同时执行多个任务(...

  • 第一章

    Java并发编程与高并发解决方案知识点:线程安全;线程封闭;线程调度;同步容器;并发容器;AQS;J.UC 高并发...

  • GCD(Using Barriers)

    Using Barriers A dispatch barrier允许您在并发调度队列(concurrent...

  • 线程和进程的区别

    学习操作系统中进程和线程的区别 1.调度性 线程是调度和分派的基本单位 2.并发性 进程和进程之间可以进行并发 同...

  • Spring中任务调度

    任务调度 任务调度即在特定的时间点执行指定的操作。任务调度本身设计多线程并发,运行时间规则制定及解析,运行现场保持...

网友评论

      本文标题:数据库-并发调度(未完结)

      本文链接:https://www.haomeiwen.com/subject/fdisoctx.html