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


图片发自App

数据库

• 数据库的并发调度

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

• 并发调度

• 串行

串行:是指在单核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上执行不同的事物,从而达到真正意义上的并行

你可能感兴趣的:(数据库-并发调度(未完结))