并发调度的可串行性:可串行化调度、冲突可串行化调度、两段锁协议
内容主线:
并发调度的可串行性
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)冲突操作 (2)可串行化调度的充分条件:冲突可串行化 三:两段锁协议 四:封锁的粒度 (1)概念 (2)选择封锁的原则 (3)多粒度封锁 A:多 ...
- mysql二级封锁协议_MySQL 行锁、两阶段锁协议、死锁以及死锁检测
行锁 MySQL的行锁都是在引擎层实现的,但是 MyISAM 不支持行锁,意味着并发控制只能使用表锁,同一张表任何时刻只能被一个更新在执行,影响到业务并发度.InnoDB 是支持行锁的,这也是 MyI ...
- 数据库理论:ER模型,关系转换,并发控制与冲突可串行化调度
目录 前言 ER模型 实体 属性 关系 参与 关系的度(degree) 一对一与一对多 ER 图符 关系转化(重要) 并发控制 概述 并发控制中的不一致性 修改丢失 不可重复读 脏读 封锁技术 封锁三 ...
- 可串行化 冲突可串行化 判断方法
这篇博文参考了中国大学mooc:战老师. 点击下方链接,进入B站观看视频,[视频编号P234附近]有相关知识点 事务调度的解释https://www.bilibili.com/video/BV1PJ4 ...
- 【51单片机】串行口连接74LS164进行串行/并行转换,输出到一个七段数码管。数码管循环显示0-9。采用串行通信方式0,定时间隔1秒。
实验内容:51单片机的串行口连接74LS164进行串行/并行转换,然后输出到一个七段数码管.数码管循环显示0-9这10个数字.要求采用串行通信方式0,定时间隔1秒. 工具:proteus+keil # ...
- mysql行级安全_MySQL学习笔记(五):MySQL表级锁和行级锁
一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)
串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...
- Linux之sed:修改器按照字符和行数进行筛选和替换行值 选项[动作
说明 sed用于选取替换删除新增 sed [选项] [动作][文件]选项: -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕. -e:允许对输入数 ...
- 三百行python代码的项目_300行Python代码打造实用接口测试框架
在刚开始实现ApiTestEngine的时候,卡斯(kasi)提议做一个Java版的.对于这样的建议,我当然是拒绝的,瞬即回复了他,"人生苦短,回头是岸啊". 当然,我没好意思跟他 ...
- element plus之el-table行融合+列融合+小计行+自定义控件+样式自定义方案
期望通过每一次分享,让技术的门槛变低,落地更容易. -- around 目录 1.行&列融合 2.小计行 3.自定义控件 4.样式自定义 前言 旨在解决项目过程中遇到基于el-table实现项 ...
最新文章
- kuka机器人焊接飞溅大_机器人专用三维焊接平台低温现象得到解决
- mysql登录密码特殊字符_mysql密码中有特殊字符在命令行下登录的操作
- Python学习笔记:Import详解2
- wxWidgets:wxWebViewEvent类用法
- 拷贝文件不移动_在不使用 mv 命令的情况下移动文件
- 分析绕过一款适合练手的云WAF
- Nginx -静态资源Web服务
- Java类集框架 —— LinkedHashMap源码分析
- hive分区用2个字段有何限制_[特性]Hive动态分区功能使用
- 怎么用javascript进行拖拽(转摘)
- matlab第七章符号对象,MATLAB语言:第七章 MATLAB符号计算
- ik做尾巴摆动 maya_【周六幸福时刻】故事分享:小蝌蚪尾巴怎么没了
- MyCat分布式数据库集群架构工作笔记0024---高可用_单表存储千万级_海量存储_分表扩展_按照日期分片
- membership配置数据库(SQL2000)
- 明天要去面试...........
- DSP程序nbsp;调试总结
- 云迁移实践:VMware虚拟机迁移到AWS
- 燕十八的php教材学完能找工作吗,燕十八的布尔教育怎么样? - php完全自学手册...
- 用php做动态时钟,时钟转动动图 如何制作转动的钟表动画?怎么做出时钟转动效果?时钟走动的动态图...
- C++ P1091 合唱队形[DP]