zoukankan      html  css  js  c++  java
  • 并发控制概念

    ---------------------------------------------------------------------------------------

    事务执行方式:

    1. 事务串行执行
    2. 交叉并发方式
    3. 同时并发方式

    并发控制机制的任务:

    • 对并发操作进行正确调度;
    • 保证事务的隔离性;
    • 保证数据库的一致性;

    并发操作带来的数据不一致性:

    丢失修改,不可重复读,读“脏”数据。

    并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。

    -----------------------------------------------------------------------------------------

    并发控制的技术:

    封锁,时间戳,乐观控制法。(商用DBMS一般采用封锁方法)

    什么是封锁?

    封锁就是事务T在对某个对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。

    加锁后事务T对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。

    基本封锁类型:排它锁(X锁,写锁)共享锁(S锁,读锁)

    排它锁:若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

    共享锁:若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这样保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

    -------------------------------------------------------------------------------------

    死锁和活锁

    活锁:打个比方,有一次我和一个朋友开车误闯单行道,前面有车过来,我们只能找个角落躲进去让他,无奈对面一直有车开过来的话我们就得一直等下去。

    避免活锁:采用先来先服务的策略。

    T1对数据加了S锁,T2要对同一个数据加X锁时就开始等待,T1释放S锁之前其他事务也对该数据加了S锁,所以T2必须等待直到该数据S锁被释放位置。

    死锁:打个比方,有老板A和老板B,A跟B说你那个方案C做的不错,可否把C给我?B说可以的,你回去等我邮件传你,那么你的资料D对我们来说也挺宝贵的,可否发给我?A也说好的,回头就发邮件给你。于是A和B回去后都在想等对方先发把资料发过来,谁都不肯先发。

    两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死锁。

    预防死锁:

    一次封锁发(降低系统并发度,难于实现精确确定封锁对象)

    顺序封锁发(维护成本高,难以确定事先要封锁对象)。

    于是操作系统广为采用的预防死锁的策略并不是很适合数据库。

    DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法。

    死锁的解除:

    超时法:事务等待时间超过了规定的时间,就认为发生了死锁。(时间设短有可能误判,设长不能及时发现)

    事务等待图法:事务等待是一个有向图G=(T,U),有环路就判定为死锁。周期性地生成事务等待图,检测事务。

    解除死锁:选择一个代价最小的事务强制解除。

    ----------------------------------------------------------------------

    并发调度可行性

    可串行化调度:多个事务的并发执行时正确的,当且仅当其结果与按某一次序串行执行这些事务时的结果相同。

    可串行性:是并发事务正确调度的准则,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。

    可串行化的充分条件:一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务部冲突操作的次序得到另一个调度Sc`,如果Sc`是串行的,称调度Sc为冲突可串行化的调度。

    一个调度是冲突可串行化,一定是可串行化的调度。

    冲突操作是指不同的事务对同一个数据的读写操作和写写操作,其他操作是不冲突的。

    不同事务的冲突操作和同一事务的两个操作不能交换。

    冲突可串行化调度是可串行化调度的充分条件,不是必要条件。还有不满足冲突可串行化条件的可串行化调度。

    两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。

    第一阶段是获得封锁,第二阶段是释放封锁。

    事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。

    ----------------------------------------------------------------------

    封锁对象的大小成为封锁粒度

    封锁的对象:逻辑单元,物理单元,

    逻辑单元:属性值,属性值集合,元组,关系,索引项,整个索引,整个数据库等

    物理单元:页(数据页,索引页)、物理记录等

    封锁的粒度越大,并发度越小,开销越小。

    封锁的粒度越小,并发度越高,开销越大。

    显示封锁和隐式封锁(上级对象加锁使得该对象也加同样的锁了)

    检测隐式封锁时,搜索上级节点,直到根节点,还要搜索下级节点。

     意向锁:加入意向锁可提高对某个数据对象检测的效率。

    如果对一个节点加意向锁,则说明该节点的下层节点正在被加锁。

    对任一节点加基本锁,必须先对它的上级节点加意向锁。

    意向共享锁IS

    意向排他锁IX

    共享意向排他锁SIX

  • 相关阅读:
    Java设计模式(Design Patterns)
    P2213 [USACO14MAR]懒惰的牛The Lazy Cow_Sliver
    P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)
    P4818 [USACO15DEC]Bessie's Dream 贝西的梦
    P3667 [USACO17OPEN]Bovine Genomics
    P4379 [USACO18OPEN]Lemonade Line
    P4378 [USACO18OPEN]Out of Sorts S
    P4089 [USACO17DEC]The Bovine Shuffle
    P4269 [USACO18FEB]Snow Boots G
    P4086 [USACO17DEC]My Cow Ate My Homework
  • 原文地址:https://www.cnblogs.com/13yan/p/2531152.html
Copyright © 2011-2022 走看看