zoukankan      html  css  js  c++  java
  • 数据库基础——并发控制

    因为多个事务对数据库的并发控制造成ACID特性被破坏,为保证数据的隔离性和一致性,需要并发控制。
     
    一、多事务并发导致的问题
    1.丢失修改(Lost Update,READ UNCOMMITED)
       T1              T2
       R(A)=16
                     R(A)=16
       W(A)=A-1
                     W(A)=A-1
       T1的修改丢失。
    2.不可重复读(Non-Repeatable Read)
       2.1T1读取数据,T2修改了数据,当T1再次读取刚才的数据发现前后不一致。
       2.2T1读取数据,T2删除数据,T1按照相同条件重新读取数据,发现数据消失3
       2.3T1读取数据,T2插入数据,T1按照相同条件重新读取数据,发现增加了数据。
       2.2和2.3被称为幻影现象(SERIALIZABLE)。
    3.读脏数据(Dirty Read)
    T1修改数据并写回磁盘,T2读取数据,T1由于某种原因被撤销,这时T1已经恢复为原值,T2读取的数据和数据库中的数据不一致。
     
     
    二、并发技术
    1.封锁
    1.1排它锁(Exclusive Locks,X锁,写锁)
      若事务T对数据对象A加上X锁,则只允许T读取和修改A。
    1.2共享所(Share Locks,S锁,读锁)
      若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能对A加S锁,不能加X锁。
    2.活锁和死锁
      封锁技术引发活锁和死锁问题。
    2.1活锁
      T1封锁数据R,T2请求封锁R,T2等待,T3请求封锁R;当T1释放R,系统首先批准T3,反复有事务申请R,均批准,则T2一直处于等待状态。
      避免活锁方法:采取先进先出策略。
    2.2死锁
      事务T1封锁数据R1,事务T2封锁数据R2,事务T1有申请封锁R2,因为T2已经封锁R2,T1一直等待T2释放R2。
      避免死锁方法:1.一次封锁法:一次把一个事务要使用的数据全部加锁(缺点:降低并发性)2.顺序封锁法:预先对数据对象有一个封锁顺序(缺点:维护封锁顺序成本高,并且很难规定)3.诊断和解除死锁(常用)
      诊断方法:1.超时法(缺点:误判和无法及时发现死锁)2.事务等待图法
      解除死锁方法:选择撤销代价较小的事务。
    3.并发调度的可串行性
      并发执行的结果应和串行执行的结果一致。
    3.1两段锁协议(Two-Phase Locking,2PL)
      定义:所有事务分两个阶段对数据加锁和解锁。

    1.对任何数据读写前,首先申请并获得对数据加锁;

    2.在释放一个封锁以后不得申请其他封锁。

    实质是一次封锁的优化实现。

    3.2封锁的力度
    封锁的对象的大小被称为封锁力度。
    3.3多粒度封锁
    3.4意向锁
  • 相关阅读:
    错误1053:服务没有及时响应启动或控制请求
    错误号码2003 Can't connect to MySQL server 'localhost' (0)
    分析slow-log 每小时慢sql情况
    用spring annotation声明的bean,当打包在jar中时,无法被扫描到
    mysql 锁查看
    linux 使用expect
    tomcat启动报错:java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener
    Spring LDAP authenticate method with Pooling
    一步步教你使用Proguard混淆Java源代码
    JAVA获取CLASSPATH路径
  • 原文地址:https://www.cnblogs.com/bluewhy/p/4962919.html
Copyright © 2011-2022 走看看