内容主线:

并发调度的可串行性

        DBMS对并发事务不固的调度可能会产生不同的结果,有正确的,有不正确的。显然串行调度是正确的。

        执行结果等价于串行调度的调度也是正确的,这样的调度叫做可串行化调度。

        1、可串行化调度

        定义:

        多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化(Serializable)的调度。

        可串行性(Serializability):

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

        例:

        现在有两个事务,分别包含下列操作:
        事务T1:读B;A=B+1;写回A
        事务T2:读A;B=A+1;写回B
        设A,B的初值均为2。
        (p317图11.7串行调度、可串行化的调度、不可串行化的调度) 

         2、冲突可串行化调度

        具有什么样性质的调度是可串行化的调度?如何判断某个调度是可串行化的调度?下面给出判断可串行化调度的充分条件。
        设有两个事务Ti和Tj,其调度为S,S中有两个相邻的语句li和lj(指read(读)或write(写)语句),分别来自Ti和Ti。如果li和lj对不同的数据操作,那么交换li和Ii的次序丝毫不影响调度执行的结果。当li和Ij对同一数据Q操作时,就不一定了。下面就li和Ij对同一数据进行操作,讨论其次序是否可交换。

        (1)li=read(Q),j=read(Q)。

        此时事务Ti和Tj读到同样的Q值,可忽视li和lj的先后次序。

        (2)li=read(Q),Ij=write(O)。

        在调度S中,如果li在lj之前,那么Ti没有读到Tj中写回的Q值,如果lj在li之前,那么Ti读了Tj中写回的Q值。这样,li和lj的次序是很重要的。
        (3)li=write(Q),Ij=read(Q)。

        情况与(2)类似。
        (4)li=write(Q),Ij=write(Q)。

        由于li和lj都是写操作,因此对事务Ti和Tj都没有影响。但数据库中保存的是Ti和Tj后一个写操作的结果,因而li和lj的次序对调度S中中随后的read语句有影响。如果调度中没有其它写语句,那么li和lj的次序将直接影响到事务结束后数据库中的值。 

        上面只有第(1)种情况中,与li和lj的先后次序无关,其它都有关系。

        定义:li和lj分别是并发事务Ti和Tj中的read或write语句,并在并发调度中相邻。当li和j是对同一数据操作时,并且致少有一个是write语句,我们称li和ij是一对“冲突”的语句,否则称为“非冲突”的语句。

        在调度S中,有一对相邻的语句是“非冲突”的语句,那么它们的先后次序可以交换。交换后产生的新调度S和S等价。 

        例:

T1       T2  
①read(A)
②write(A)
read(A)
write(A)
⑤read(B)
⑥write(B)
read(B)
write(B)

        调度如下:

        Sc=r1(A)w1(A)r2(A)w2(A)r1(B)w1(B)r2(B)w2(B)

        w1(A)r2(A)此处:w1(A):事务T1 对A 写操作 r2(A) 事务T2 对A读操作  两者为相邻操作且同对A 操作,所以此时为冲突语句,顺序不可以交换!

w2(A)r1(B)w1(B) :此时是对不同数据进行读写,不是冲突语句,所以此时可以交换顺序

        Sc=r1(A)w1(A)r2(A)r1(B)w1(B)w2(A)r2(B)w2(B)

        S`c=r1(A)w1(A)r1(B)w1(B)r2(A)w2(A) r2(B)w2(B)

        将Sc中不冲突的调度的顺序进行调整,变成了S`c先执行事务T1 再执行事务T2,为串行调度
        在这个并发调度中,事务T1中的w1(A)和T2中的r2(A)是一对冲突的语句,次序不能交换。

        交换非冲突语句:

        [1]T2中的w2(A)和T1中的r1(B)w1(B)交换;

        [2]T2中的r2(A)和T1中的r1(B)w1(B)交换;

        等价于先执行T1后执行T2的串行调度

        定义:

        如果调度S`是从调度S通过交换一系列的非冲突语句得到,那么称S和S是一对“冲突等价”调度。如果调度S与某个串行调度是“冲突等价”,那么称调度S是“冲突可串行化”的调度。 

       冲突可串行化的调度:可以推出这个调度是可串行化的调度

        可串行化的调度:不能推出这个调度是冲突可串行化的调度

        两段锁协议

        为了保证并发调度的正确性,DBMS的并发控制机制必须提供一定的手段来保证调度是可串行化的。目前DBMS普遍采用两段锁(Two-Phase Locking,简称2PL)协议的方法实现并发调度的可串行性,从而保证调度的正确性。

        两段锁协议是封锁协议的一种。

        【封锁协议(LockingProtocol):

        在运用封锁方法时,对数据对象加锁时需要约定一些规则,例如何时申请封锁、持锁时间、何时释放封锁等。我们称这些规则为封锁协议。

        约定不同的规则,就形成了各种不同的封锁协议。两段封锁协议是最常用的一种封锁协议,理论上已经证明使用两段封锁协议产生的是可串行化调度。】 

        两段锁协议(考):

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

        1)在对任何数据进行速、写操作之前,事务首先要申请并获得对该数据的封锁,

        2)在释放一个封锁之后,事务不再获得任何其他封锁。

        “两段”锁的含义事务分为两个阶段:

        第一阶段是获得封锁,也称为扩展阶段:

        在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁, 

         第二阶段是释放封锁,也称为收缩阶段。

        在这阶段,事务可以释放任何数据项上的任何类型的锁,但不能再申请任何锁

     例如:

        事务Ti遵守两段锁协议,其封锁序列是:
        Slock A…Slock B… Xlock C…(第一段锁协议:加锁)Unlock B….Unlock A….UnlockC:(释放封锁阶段:只能释放封锁)
        事务Tj不遵守两段锁协议,其封锁序列是:
        Slock A(获得锁) .…. Unlock A(释放锁)…. Slock B(获得锁)… Xlock C… Unlock C(释放锁)….Unlock B:

        可以证明,并发执行的所有事务均遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。(p301验证例子)。所有遵守两段锁协议的事务,其并发执行的结果一定是正确的。

        事务遵守两段锁协议是可串行化调度的充分条件(遵循两端锁协议=>可串行化调度),而不是必要条件(可串行调度!=>遵循两段锁协议)。 

封锁粒度 (自己看书了解):需要掌握多粒度封锁、意向锁

并发调度的可串行性:可串行化调度、冲突可串行化调度、两段锁协议相关推荐

  1. (数据库系统概论|王珊)第十一章并发控制-第五、六、七节:并发调度的可串行性、两段锁协议和封锁的粒度

    文章目录 一:可串行化调度 二:冲突可串行化调度 (1)冲突操作 (2)可串行化调度的充分条件:冲突可串行化 三:两段锁协议 四:封锁的粒度 (1)概念 (2)选择封锁的原则 (3)多粒度封锁 A:多 ...

  2. mysql二级封锁协议_MySQL 行锁、两阶段锁协议、死锁以及死锁检测

    行锁 MySQL的行锁都是在引擎层实现的,但是 MyISAM 不支持行锁,意味着并发控制只能使用表锁,同一张表任何时刻只能被一个更新在执行,影响到业务并发度.InnoDB 是支持行锁的,这也是 MyI ...

  3. 数据库理论:ER模型,关系转换,并发控制与冲突可串行化调度

    目录 前言 ER模型 实体 属性 关系 参与 关系的度(degree) 一对一与一对多 ER 图符 关系转化(重要) 并发控制 概述 并发控制中的不一致性 修改丢失 不可重复读 脏读 封锁技术 封锁三 ...

  4. 可串行化 冲突可串行化 判断方法

    这篇博文参考了中国大学mooc:战老师. 点击下方链接,进入B站观看视频,[视频编号P234附近]有相关知识点 事务调度的解释https://www.bilibili.com/video/BV1PJ4 ...

  5. 【51单片机】串行口连接74LS164进行串行/并行转换,输出到一个七段数码管。数码管循环显示0-9。采用串行通信方式0,定时间隔1秒。

    实验内容:51单片机的串行口连接74LS164进行串行/并行转换,然后输出到一个七段数码管.数码管循环显示0-9这10个数字.要求采用串行通信方式0,定时间隔1秒. 工具:proteus+keil # ...

  6. mysql行级安全_MySQL学习笔记(五):MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  7. a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)

    串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...

  8. Linux之sed:修改器按照字符和行数进行筛选和替换行值 选项[动作

    说明 sed用于选取替换删除新增 sed [选项] [动作][文件]选项: -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕. -e:允许对输入数 ...

  9. 三百行python代码的项目_300行Python代码打造实用接口测试框架

    在刚开始实现ApiTestEngine的时候,卡斯(kasi)提议做一个Java版的.对于这样的建议,我当然是拒绝的,瞬即回复了他,"人生苦短,回头是岸啊". 当然,我没好意思跟他 ...

  10. element plus之el-table行融合+列融合+小计行+自定义控件+样式自定义方案

    期望通过每一次分享,让技术的门槛变低,落地更容易. -- around 目录 1.行&列融合 2.小计行 3.自定义控件 4.样式自定义 前言 旨在解决项目过程中遇到基于el-table实现项 ...

最新文章

  1. kuka机器人焊接飞溅大_机器人专用三维焊接平台低温现象得到解决
  2. mysql登录密码特殊字符_mysql密码中有特殊字符在命令行下登录的操作
  3. Python学习笔记:Import详解2
  4. wxWidgets:wxWebViewEvent类用法
  5. 拷贝文件不移动_在不使用 mv 命令的情况下移动文件
  6. 分析绕过一款适合练手的云WAF
  7. Nginx -静态资源Web服务
  8. Java类集框架 —— LinkedHashMap源码分析
  9. hive分区用2个字段有何限制_[特性]Hive动态分区功能使用
  10. 怎么用javascript进行拖拽(转摘)
  11. matlab第七章符号对象,MATLAB语言:第七章 MATLAB符号计算
  12. ik做尾巴摆动 maya_【周六幸福时刻】故事分享:小蝌蚪尾巴怎么没了
  13. MyCat分布式数据库集群架构工作笔记0024---高可用_单表存储千万级_海量存储_分表扩展_按照日期分片
  14. membership配置数据库(SQL2000)
  15. 明天要去面试...........
  16. DSP程序nbsp;调试总结
  17. 云迁移实践:VMware虚拟机迁移到AWS
  18. 燕十八的php教材学完能找工作吗,燕十八的布尔教育怎么样? - php完全自学手册...
  19. 用php做动态时钟,时钟转动动图 如何制作转动的钟表动画?怎么做出时钟转动效果?时钟走动的动态图...
  20. C++ P1091 合唱队形[DP]

热门文章

  1. Java的环境变量在哪个文件夹_Java设置环境变量
  2. 网页中有大量图片加载很慢,用什么方法进行优化
  3. [SSL_CHX][2021-8-18]角谷猜想
  4. Android虚拟机的理解和内存管理
  5. Mac如何读写外接硬盘?
  6. Stm32中英文手册官网免费
  7. catch小说内容-从gui到爬虫(2)
  8. 不小心删除JDK文件夹,无法重新安装该怎么办*
  9. Top K Frequent Elements
  10. 报表开发工具ActiveReports实战应用教程——分组报表