数据库复习--并发控制

1、并发控制:为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度

并发控制的主要技术有:封锁、时间戳、乐观控制法、多版本并发控制等
并发操作带来的数据不一致性:

  1. 丢失修改:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失
  2. 不可重复读:指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果
  3. 读脏数据:事务T1修改某一数据后并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致
     

2、并发控制的基本方法:封锁(锁、S锁)

        1  排他锁/写锁,X锁

若事务T对数据对象A加上X锁,则只允许事务T读取和修改A

事务T释放A上的锁之前:其他事务不能读取和修改A,不能再对A加任何类型的锁

        2  共享锁/读锁,S锁

若事务T对数据对象A加上S锁,则事务T可以读取A,但不能修改A

事务T释放A上的S锁之前:其他事务可以读取A,可以对A加S锁,但不能修改A,也不能对A加X锁封锁类型的相容矩阵:

 3、封锁协议:约定何时申请锁/S锁、持续时间、何时释放等等

  • 一级封锁协议

事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放

  • 二级封锁协议

事务T在修改数据R之前必须先对其加×锁(一级封锁协议),并且其他事务在读取数据之前必须先对其加S锁,读完后即可释放S锁

  • 三级封锁协议

事务T在修改数据R之前必须先对其加X锁(一级封锁协议),并且其他事务在读取数据之前必须先对其加S锁,直到事务结束才释放(二级封锁协议是读完就能释放)

不同级别的封锁协议和一致性保证:

 4、活锁和死锁

活锁:

事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待;T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待;T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求..…..…T2有可能永远等待,产生活锁
避免活锁:采用先来先服务的策略


死锁:

事务T1封锁了数据R1,T2封锁了数据R2,T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁,接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1,释放R1上的锁,这样T1在等待T2,而T2又在等待T1,T1和T2两个事务永远不能结束,形成死锁


解决活锁的方法:

  • 死锁的预防
  1. 一次封锁法:每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行
  2. 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务按这个顺序实施封锁
  • 死锁的诊断和解除

诊断:(1)超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
            (2)等待图法:构建事务等待图(有向图:节点表示运行的事务,边表示事务等待的情况),存在回路即死锁解除:选择一个处理死锁代价最小的事务,将其撤销(UNDO),释放此事务持有的所有的锁
 

5、可串行化调度:多个事务并发执行的结果=这些事务按某种次序串行执行的结果
 

一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。例如现有事务T1和T2,若T1与T2的并发执行结果与先T1后T2相同,或者与先T2后T1相同,那么这个调度就是正确的,否则就是错误的
 

6、冲突可串行化调度

冲突操作:指不同的事务对用一个数据的读写操作(读和写)和写写操作(写和写)
不同事务的冲突操作和同一事物的两个操作是不能交换的,如果发生交换,自然会发生错误。基于此,如果调度能保证冲突操作的次序不变,就称为冲突可串行化的调度。冲突可串行化调度一定是可串行化调度。(但是注意,可串行化调度也有可能不满足冲突可串行化)

7、两段锁协议(2PL):所有事务必须分两个阶段对数据项加锁和解锁

  1. 获得封锁(扩展阶段)∶在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
  2. 释放封锁(收缩阶段)︰在释放一个封锁之后,事务不再申请和获得任何其他封锁
     

若并发执行的所有事务均遵守两段锁协议,则对这些事物的任何并发调度策略都是可串行化的
 

  • 7
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN(中国软件开发网)是一个技术交流平台,其中涵盖了各种领域的技术内容,包括数据库数据库复习是指回顾和巩固数据库的相关知识和技能。 数据库是存储、管理和组织数据的一种数据结构。在软件开发中,数据库起到储存数据的作用,同时也提供了数据操作、查询和管理的功能。因此,深入理解数据库的原理和技术对于开发人员来说非常重要。 数据库复习的内容可以包括以下几个方面: 1. 数据库基础知识:了解数据库的概念、特点、分类和常用的数据库系统,如关系型数据库(如MySQL、Oracle)和非关系型数据库(如MongoDB、Redis)。 2. SQL语言:掌握SQL语言的基本语法、查询、更新、删除和插入数据的操作,熟悉常用的SQL函数和操作符,能够编写复杂的SQL查询语句和数据操作语句。 3. 数据库设计:了解数据库设计的基本原则和范式,能够进行数据库的逻辑设计和物理设计,并能评估和调整数据库的性能。 4. 数据库索引和优化:理解数据库索引的原理和类型,了解索引的创建、使用和优化策略,能够通过合理的索引设计和优化来提升数据库的查询性能。 5. 数据库事务和并发控制:掌握数据库事务的概念和特性,理解并发访问引起的数据一致性问题,学会应对并发访问的技巧和控制策略。 6. 数据库备份和恢复:了解数据库备份和恢复的重要性,掌握常用的数据库备份和恢复方法和工具,能够制定和执行数据库的备份和恢复策略。 7. 数据库安全性:熟悉数据库的安全性问题和常见的安全攻击,能够使用数据库的安全机制和技术来防护和保护数据的安全。 通过对CSDN中数据库相关文章的阅读、学习和实践,可以加深对数据库的理解和掌握,提高数据库的设计和开发能力。此外,还可以通过访问CSDN的论坛和社区,与其他开发者交流和分享经验,进一步提升自己的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值