第十一章-并发控制

11章 并发数据

  • 了解并发需要先了解的概念:
    • 1.数据库是一个可以共享资源,可以多用户同时使用一个数据库,该数据库称为多用户数据库,如订票系统、银行系统
    • 2.多事务执行方式:
      • 1.事务串行执行 :
        务执行完在执行下一个事务 - 缺点资源浪费

        2.交叉并发方式 :
        在单处理机系统中,事务的并行事务是提供交叉运行,如T1事务去读数据A,读需要耗时,T2事务就开始运行,T1读完又去执行T1下面的操作,遇到T1等待又去执行T2,以此类推

        3.同时并发方式:-- 了解,该书不详讲
        多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务自正的并发

10.1并发控制概念:

  • 事务是并发控制的基本单位,并发控制机制任务是:
    • 1.并发操作进行正确的调度(正确的调各并发的事务)
      2.保证事务的隔离性(保证事务在执行的过程中不能被其它的事务打扰)
      3.保证数据库的一致性(刚读A数据为1,马上A就变成2,这就不一致了)

  •  为什么需要并发控制:并发时又多个事务在执行,如果没有正确的调度,调度事务就会打架,产生数据混乱

  • 用记号R(x)标识读数据x,W(x)表示写数据x 

  • 案例1飞机卖票-并发操作带来的不一致性:

    • 售票窗口(T1事务)和售票窗口(T2事务),并发去访问数据库中的票数余额A=16,如果T1和T2都,
      卖出去一张票,都A-1=15,然后写回数据库,因为T1和T2都执行了A-1=15,所以明明是卖出去两张,实际卖出去了一张

  • 说明:

    • 1.案例1的情况称为数据库的不一致性,是由并发产生的
      2.T1和T2的存在顺序的调度是随机的
      3.并发操作带来的数据不一致性包括:丢失数据、不可重复度、读'脏'数据

  • 1.丢失数据:

    • T1和T2事务,读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1数据丢失,如售票案例

  •  2.不可重复读:

    • T1读取数据A=15,T2对A进行更改,T1在去读的时候就读不到上一次的结果

    • 不可重复读分三种情况,1.读取值不一致、2.数据消失、3.多出数据(2和3称为幻影现象):

      • 1.读取不一致:T1和T2读A=15,T2更改A,T1在去校对重读A,就与第一次读取的值不一致
        2.数据消失:T1按照条件查找到数据,T2删除了其中部分的数据,T1在按同样的数据去读取时,发现数据就消失了
        3.多出数据:T1按照条件查找到数据,T2插入了一些的数据,T1在按同样的数据去读取时,发现多了一些数据

  • 3.读“脏”数据:

    • 读“脏”数据表达读到不正确的数据     

    • T1读取数据A=15,并修改为99,T2读取数据A=99,当T1撤销修改操作,A改回15,那么T2读的就是“脏”数据,因为和数据库的数据不一致

  • 说明:

    • 1.以上的3类不一致主要原因就是并且操作破坏了事务的隔离性
      2.并发操作要正确的方式调度,使一个事务的执行不受其它事务的影响,避免造成数据的不一致(某些情况下可以数据不一致,这种情况是因为影响不大)
      3.并发的主要技术:封锁、时间戳、乐观控制法、多版本并发控制

11.2 封锁:

  • 1.什么是封锁:
    • 封锁是实现并发控制的一个非常重要技术
      • 封锁就是事务T1在等某个数据对象(如表、记录)操作之前,先向系统发生请求,对其加锁。加锁后T1对该
        数据对象就有了一定的控制,在事务T1释放锁之前,其它事务不能更新该数据对象

  • 2.基本的封锁类型:

    • 一个事务对数据对象加锁后拥有什么样的控制是由封锁的类型决定
      基本的封锁类型:排它锁(简称:x锁)、共享锁(简称:s锁)  

    • 2.1.排它锁:
      • 排它锁 -- 又称写锁
      • 理解:当某个事务T1,给数据对象A加上x锁后,只有T1可以进行读取和修改,
        其它的事务就不能在对A加任何类型的锁,只到T1释放A上的锁,这样不就保证了,
        T1释放A上的锁时,不被其它事务所干扰

    • 2.2.共享锁:

      • 排它锁 -- 又称读锁

      • 理解:当某个事务T1,给数据对象A加上s锁后,T1可以进行读取但不能进行修改,
        其它事务可以在对A加上s锁,但不能加x锁,直到T1释放了锁,这样就保证了,
        在其它事务都可以读A,都不能修改A,保证了数据一致

    • 2.3 锁的相容钜陈:

  • 3.细节:

    • 封锁 也可以叫 加锁

11.3 封锁协议:

  • 1.封锁协议的作用:解决三个不一致性(不可重复读、丢失修改、读"脏"数据)
  • 2.什么是封锁协议:封锁协议是指运用x锁和s锁对数据对象加锁时,约定一些规则,这些规则为封锁协议
    • 例如何申请x锁和s锁、持锁时间、何时释放等
  • 3.三级封锁协议(该数只讲三级协议):封锁方式规定不同的规则,形成不同的封锁协议,不同的协议在不同
    的程度上为并发操作的正确调度提供一定的保证。

    • 3.1.一级协议
      • 1.什么是一级封锁协议:一级封锁协议是指事务T1在修改数据R正确必须对其加X锁直到事务结束才释放;事务又分正常结束、非正常结束
      • 2.一级封锁协议作用:
        • 1.防止丢失数据,并保证事务T1可恢复(恢复:这里的恢复指可以重复读到数据)
          2.在一级封锁协议中,只是读数据是不用加锁的

      • 3.一级封锁协议存在问题:一级封锁协议可能会出现,不可重复读、和读"脏"数据

      • 4.解决丢失修改问题:

    • 3.2二级封锁协议:

      • 1.什么是二级封锁协议:二级封锁协议是一级封锁协议增强事务T1在读取数据R前必须对其加S锁,读完后即可释放S锁

      • 2.二级封锁协议作用:

        • 1.防止丢失数据,和读“脏”数据

      • 3.二级封锁协议存在问题:由于读完数据后即可释放S锁,所以会存在,不可重复读

      • 4.解决读“脏”数据问题:

    • 3.3三级封锁协议:

      • 1.什么是三级封锁协议:三级封锁协议是一级封锁协议增强事务T1在读取数据R前必须对其加S锁,直到事务的结束

      • 2.三级封锁协议作用:

        • 1.防止丢失数据、读“脏”数据和不可重复读

        • 3.解决不可重复读问题:

  • 4.课本总结:

    • 1.三级协议的主要区别是,什么操作需要申请封锁协议以及何时释放锁
      1.1.写的操作必须是-x锁,释放时间-直到事务结束
      1.2.读的操作的释放时间-1.读完就释放-2.直到事务的结束
      2.不同的封锁协议使事务达到的一致性级别不同,封锁协议越高,一致性程度越高

  • 5.个人总结:

    • 1.一级封锁协议:事务加x锁,释放时间-事务结束,防止丢失修改,有不可重复的和读“脏”数据问题
      2.二级封锁协议:事务加s锁,释放时间-读完就释放,防止丢失修改,读“脏”数据,有不可重复的和问题
      3.三级封锁协议:事务加s锁,释放时间-事务结束,防止丢失修改,读“脏”数据,不可重复

 

11.4 活锁和死锁:

 

11.4.1 活锁:

  • 1.什么是活锁:一个事务长时间的去等待操作(或获取)一个数据对象,都没有等到
    • 例子:事务T1封锁封锁了数据R,T2请求封锁R,T3请求封锁R,T1释放了R,但得到请求封锁的是T3,
      如果T4又请求封锁R,T3释放,T4得到请求封锁,T2又没得到请求封锁,这就是活锁 - 可看图理解

  • 1.1.怎么避免活锁:

    • 1.先来先服务(就是多个事务请求同一个数据对象,谁先来就执行谁)

    • 2.按优先级(每一个按优先级来执行,如有紧急的事务,可以提高该事务的优先级来先执行)

  • 2.什么是死锁:怎么都请求不到数据对象

    • 例子:事务T1对R1封锁,事务T2对R2封锁,现在事务T1要对R2请求封锁,因为T2在封锁中,请求不了,
      T2有要对R1请求封锁,T1和T2请的请求不了,就就是死锁 - 可看图理解

  • 2.1.产生死锁的原因:两个或多个事务,都一级封锁了一些数据对象,然后又请求被其它事务封锁的数据对象加锁,从而死锁

  • 2.1.2.解决死锁的方法:预防死锁-和诊断与解除死锁

    • 2.1.3预防死锁:预防死锁分为,1.一次封锁法、2.顺序封锁法

    • 预防死锁就是压迫破坏产生死锁的条件

      • 2.1.4.一次封锁法:

        • 1.什么是一次封锁法:每个事务必须一次将所有的数据全部加锁,否则就不能执行

        • 2.存在问题:

          • 1.降到系统并发度(你的封锁完了,其它事务怎么用)

          • 2.难于事先精确确定封锁对象(我怎么最知道我要确定要用哪些数据对象)

      • 2.1.5.顺序封锁法:

        • 1.什么是顺序封锁法:预先对数据对象排序(数据库管理系统做的活 - 排序),所有事务都按这个事务进行封锁

          • 排序?什么意思:给每个事务排序,只有封锁了1,才能去封锁2,以此内推

        • 2.存在问题:

          • 1.维护成本高(进行了增删改操作,就又要重新排序)

          • 2.难以实现(事务的封锁,是随着事务的执行而动态决定的,很难确定要封锁哪个对象)

        • 2.1.5.预防死锁总结:

          • 1.预防死锁不适合数据库

          • 2.数据库在解决死锁的问题上普遍才用诊断与解除死锁

    • 2.2.诊断与解除死锁:死诊断分为:1.超时法、2.等待图法
      • 2.2.1.超时法:

        • 1.什么是超时法:事务等待时间超过规定的时限,就认为发生了死锁

        • 2.优缺点:

          • 优点:实现简单

          • 缺点:1.可能误判,如事务因为其它原因导致超时,2.时限限制过长,死锁发生后不能及时发现

      • 2.2.2.等待图法:

        • 1.什么是等待图法:事务等待图是一个有向图G=(T,U)、其中:

          • T为结点集合(每个结点表示运行的事务),

          • U为边的集合(每条边表示事务等待情况)

        • 例:T1等待T2,则T1,T2之间划一条有向边,从T1指向T2

        • 2.等待图法说明:

          • 1.数据库管理系统的并发控制子系统按周期性(如每隔多少秒),生成事务等待图,检测事务,如果存在回路,则表示系统中出现死锁

          • 2.解除死锁的方法是限制一个处理死锁代价最小的事务,将其撤销,释放该事务的所有锁,使其它事务能继续运行下去

        •  

           

            

     

    

  

 



 

 

 

  

    

 

              

       

  

 

      

        

 

    

  

        

 

 

    

    

   

    

    

     

 

作者:Mr_申原文地址:https://www.cnblogs.com/Mr-shne/p/16934631.html

%s 个评论

要回复文章请先登录注册