数据库十一章——并发控制

2023-11-14

11.1  并发控制概述

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

1.丢失修改(Lost Update)两个事务T1T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失。

2.不可重复读(Non-repeatable Read)指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。

3.读“脏”数据(Dirty Read):事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,T2读到的数据就为“脏”数据,即不正确的数据

  • 不可重复读包括三种情况:

1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值

2)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘地消失了。

3)事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。

     后两种不可重复读有时也称为幻影现象(Phantom Row

2.数据不一致性:由于并发操作破坏了事务的隔离性

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

4.记号: R(x):读数据x     W(x):写数据x

5.并发控制的主要技术 :封锁(Locking);时间戳(Timestamp);乐观控制法;多版本并发控制(MVCC)

11.2  封锁

1.什么是封锁

  • 封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁
  • 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
  • 封锁是实现并发控制的一个非常重要的技术

2.基本封锁类型

  • 一个事务对某个数据对象加锁后究竟拥有什么样的控制由封锁的类型决定。
  • 基本封锁类型排它锁(Exclusive Locks,简记为X锁)共享锁(Share Locks,简记为S锁)

排它锁又称为写锁

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

共享锁又称为读锁

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

11.3  封锁协议

三级封锁协议

1.一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。

  • 正常结束(COMMIT
  • 非正常结束(ROLLBACK

一级封锁协议可防止丢失修改,并保证事务T是可恢复的。

在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。

例: 

2.二级封锁协议

  • 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
  • 二级封锁协议可以防止丢失修改和读“脏”数据。
  • 在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。

例: 

3.三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。

  • 三级封锁协议可防止丢失修改、读脏数据和不可重复读。

例: 

11.4  活锁和死锁

11.4.1 活锁

  • 事务T1封锁了数据R
  • 事务T2又请求封锁R,于是T2等待。
  • T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。
  • T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……
  • T2有可能永远等待,这就是活锁的情形

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

当多个事务请求封锁同一数据对象时,按请求封锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁

11.4.2 死锁

解决死锁的两类方法

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

1. 死锁的预防:1)一次封锁法 2)顺序封锁法

2. 死锁的诊断与解除

 Ⅰ 死锁的诊断

1)超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁

v优点:实现简单

v缺点:有可能误判死锁;时限若设置得太长,死锁发生后不能及时发现

2)等待图法:用事务等待图动态反映所有事务的等待情况

  • 事务等待图是一个有向图G=(TU)
  • T为结点的集合,每个结点表示正运行的事务
  • U为边的集合,每条边表示事务等待的情况
  • T1等待T2,则T1T2之间划一条有向边,从T1指向T2

Ⅱ 解除死锁

  • 选择一个处理死锁代价最小的事务,将其撤消
  • 释放此事务持有的所有的锁,使其它事务能继续运行下去

11.5  并发调度的可串行性

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

11.5.2 冲突可串行化调度

1.冲突操作:是指不同的事务对同一数据的读写操作和写写操作:

      Ri(x)Wj(x)         /*事务TixTjx,其中i≠j*/

      Wi(x)Wj(x)         /*事务TixTjx,其中i≠j*/

     其他操作是不冲突操作

2.不能交换(Swap)的动作:  同一事务的两个操作;不同事务的冲突操作

3.一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc,如果Sc是串行的,称调度Sc冲突可串行化的调度

  • 若一个调度是冲突可串行化,则一定是可串行化的调度
  • 可用这种方法判断一个调度是否是冲突可串行化的

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

    [11.4]3个事务 T1=W1(Y)W1(X)T2=W2(Y)W2(X)T3=W3(X)

调度L1=W1(Y)W1(X)W2(Y)W2(X) W3(X)是一个串行调度。

调度L2=W1(Y)W2(Y)W2(X)W1(X)W3(X)不满足冲突可串行化。但是调度L2是可串行化的,因为L2执行的结果与调度L1相同,Y的值都等于T2的值,X的值都等于T3的值

11.6  两段锁协议

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

  • 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
  • 在释放一个封锁之后,事务不再申请和获得任何其他封锁

注意:

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

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

v若并发事务的一个调度是可串行化的,不一定所有事务都符合两段锁协议

2.两段锁协议与防止死锁的一次封锁法

  • 一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议
  • 但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁

11.7  封锁的粒度

一、封锁粒度

1.封锁对象的大小称为封锁粒度(Granularity)

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

     例:在关系数据库中,封锁对象:

  • 逻辑单元: 属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等
  • 物理单元:页(数据页或索引页)、物理记录等

二、选择封锁粒度的原则

1.封锁粒度与系统的并发度和并发控制的开销密切相关。

  • 封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;
  • 封锁的粒度越小,并发度较高,但系统开销也就越大

例:

  • 若封锁粒度是数据页,事务T1需要修改元组L1,则T1必须对包含L1的整个数据页A加锁。如果T1A加锁后事务T2要修改A中元组L2,则T2被迫等待,直到T1释放A
  • 如果封锁粒度是元组,则T1T2可以同时对L1L2加锁,不需要互相等待,提高了系统的并行度。
  • 又如,事务T需要读取整个表,若封锁粒度是元组,T必须对表中的每一个元组加锁,开销极大

2.多粒度封锁(Multiple Granularity Locking)

  •     在一个系统中同时支持多种封锁粒度供不同的事务选择
  • 选择封锁粒度同时考虑封锁开销和并发度两个因素, 适当选择封锁粒度

n需要处理多个关系的大量元组的用户事务:以数据库为封锁单位

n需要处理大量元组的用户事务:以关系为封锁单元

n只处理少量元组的用户事务:以元组为封锁单位

11.7.1 多粒度封锁

1.多粒度树

  • 以树形结构来表示多级封锁粒度
  • 根结点是整个数据库,表示最大的数据粒度 
  • 叶结点表示最小的数据粒度

2.多粒度封锁协议

v允许多粒度树中的每个结点被独立地加锁

v对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁

v在多粒度封锁中一个数据对象可能以两种方式封锁:显式封锁和隐式封锁           ——两者的效果一样

  • 显式封锁: 直接加到数据对象上的封锁
  • 隐式封锁:是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁

11.7.2 意向锁

1.意向锁

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

v对任一结点加基本锁,必须对它的上层结点加意向锁

例如,对任一元组加锁时,必须先对它所在的数据库和关系加意向锁

2.常用意向锁

(1)意向共享锁(Intent Share Lock,简称IS)

   IS锁: 如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。

  例如:事务T1要对R1中某个元组加S锁,则要首先对关系R1和数据库加IS

(2)意向排它锁(Intent Exclusive Lock,简称IX)

   IX锁:  如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X

(3)共享意向排它锁(Share Intent Exclusive Lock,简称SIX)

  SIX锁:  如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX = S + IX

   例:对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别元组(所以要对该表加IX锁)。

3.具有意向锁的多粒度封锁方法

  • 申请封锁时应该按自上而下的次序进行
  • 释放封锁时则应该按自下而上的次序进行

   例如:事务T1要对关系R1S

  • 要首先对数据库加IS
  • 检查数据库和R1是否已加了不相容的锁(XIX)
  • 不再需要搜索和检查R1中的元组是否加了不相容的锁(X)

11.8  小结

一、封锁协议小结:

1.三级协议的主要区别:什么操作需要申请封锁以及何时释放锁(即持锁时间)

2.不同的封锁协议使事务达到的一致性级别不同

封锁协议级别越高,一致性程度越高

二、数据库的并发控制通常使用封锁机制

  • 基本封锁
  • 多粒度封锁
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库十一章——并发控制 的相关文章

  • python开发面向对象基础:人狗大战学面向对象

    一 通过函数写人狗大战这个故事 1 usr bin env python 2 coding utf 8 3 4 1 函数 人模子 5 def person name level life value 6 p dic 7 name name
  • C++专题:多态性与虚函数(详细!)

    目录 多态性的概念 虚函数 动态联编 晚绑定 和静态联编 早绑定 覆盖 重写 重载 隐藏 成员函数覆盖 重写 成员函数重载 成员函数隐藏 重定义 纯虚函数 抽象类 虚析构函数 限制构造函数 多态性是面向对象程序设计的重要特征之一 多态性机制
  • SQL及NoSQL学习系列1

    关系型数据库SQL 关系型数据库系统实现了关系模型 并用它来处理数据 关系模型在表中将信息与字段关联起来 也就是schemas 从而存储数据 这种数据库管理系统需要结构 例如表 在存储数据之前被定义出来 有了表 每一列 字段 都存储一个不同

随机推荐

  • javassist 在 spring boot jar中启动报错:javassist.NotFoundException

    由于需要在Springboot项目中动态替换一个方法的实现 所以引入了javassist 然而在IDEA中开发时一切正常 但是java jar启动就报错 Caused by javassist NotFoundException 在stac
  • [创业之路-64]:股权激励的十种形式

    薪酬有三件事 第一 实际绩效提高 第二 员工感受提高 第三 放大员工的未来价值 股权激励是放大价值最有效的说法 股权激励有利于企业与员工成为利益共同体 让员工相信对企业有利的一定对自己有利 股权激励有两个方向 一个是与奖励相关 二是与福利相
  • python入门学习随记(四)

    4 1 查找指定字符 本题要求编写程序 从给定字符串中查找某指定的字符 输入格式 输入的第一行是一个待查找的字符 第二行是一个以回车结束的非空字符串 不超过80个字符 输出格式 如果找到 在一行内按照格式 index 下标 输出该字符在字符
  • WinForm:禁用Panel容器滚动条自动移动位置的功能

    今天遇到了一个问题 描述如下 有一个Panel容器 将AutoScroll属性设置为True 此时Panel容器会在内容过多时自动展示一个滚动条 这个滚动条存在一个缺点 即会随着焦点变化自动滚向焦点位置 如果仅初始化界面时Panel滚动条位
  • MIT-BIH ECG 心电数据的下载和读取图解

    一 如何下载获取MIT BIH的数据从下面这个官方链接页面可以下载到所有48组MIT BIH心电数据 http www physionet org physiobank database mitdb 下面这个链接是MIT BIH数据库的详细
  • cocos2dx游戏以插件形式嵌入IE浏览器的实现

    一 cocos2dx渲染窗口修改及导出dll 1 思路 cocos2dx引擎使用opengl进行游戏画面的渲染 opengl的渲染窗口由其自身创建 具有跨平台性 那么我可以对渲染窗口进行修改 便可以达到将游戏窗口嵌入其他窗口的效果 2 实现
  • 【火灾检测】基于HSV特征实现火灾检测附matlab代码

    1 简介 针对传统火灾监测系统对于大空间的室内场合和开阔的室外环境易失效的问题 提出了一种结合火灾火焰特征和烟雾特征来进行判断的数字图像型火灾监测算法 火焰颜色特征是基于RGB颜色模型中的R G B三基色分量和它们之间的关系来判断是否有火焰
  • 网络攻防——ARP欺骗

    arp基础攻防 1 什么是arp攻击 2 arp攻击条件 3 arp如何进行攻击 3 1靶机环境搭建 3 2攻击机环境搭建 3 3如何发起arp攻击 4 如何防止arp攻击 5 参考文献 1 什么是arp攻击 ARP攻击是指攻击者利用ARP
  • python [3.2] urllib的使用

    urllib是python的一个获取url Uniform Resource Locators 统一资源定址器 的模块 它用urlopen函数的形式提供了一个非常简洁的接口 这使得用各种各样的协议获取url成为可能 它同时 也提供了一个稍微
  • 图灵1

    简介 艾伦 麦席森 图灵 英语 Alan Mathison Turing 1912年6月23日 1954年6月7日 英国数学家 逻辑学家 被称为计算机科学之父 人工智能之父 艾伦 麦席森 图灵 生平 1912年6月23日 艾伦 麦席森 图灵
  • SpringAOP的实现原理

    一 SpringAOP的面向切面编程 是面向对象编程的一种补充 用于处理系统中分布的各个模块的横切关注点 比如说事务管理 日志 缓存等 它是使用动态代理实现的 在内存中临时为增强某个方法生成一个AOP对象 这个对象包含目标对象的所有方法 在
  • 求m到n之间的素数和(函数)python

    目录 题目描述 AC代码 题目描述 输入两个正整数m和n m
  • k8s持久化存储

    目录 一 为什么要做持久化存储 1 emptyDir类型 2 hostPath 3 nfs 4 pvc 1 pv是什么 2 PVC是什么 5 storageclass 一 为什么要做持久化存储 在k8s中部署的应用都是以pod容器的形式运行
  • Windows 安装Redis(图文详解)

    一 Redis是什么数据库 Remote Dictionary Server Redis 是一个开源的使用 ANSI C 语言编写 遵守 BSD 协议 支持网络 可基于内存 分布式 可选持久性的键值对 Key Value 存储数据库 并提供
  • eclipse怎么在包里建一个包

    实现效果如下图 废话不多说 上图 1 设置Package Presentation 为Hierarchical 最为关键一步 2 在src下新建一个名为com abc hrm的包 3 在父包下新建子包a 因为只有一个子包 建完的子包会这样显
  • 关于绿色校园建设中综合能效平台的管理效益与研究

    摘要 伴随当前环保理念的不断发展 绿色节能理念也在逐步深入校园 为响应国家建设节约型校园的号召 本文以校园智能化综合能效管理平台建设为主题 介绍了平台建设方案 比较了某高校平台建设前后学生宿舍 教学及实训楼用能情况 分析结果表明高校综合能效
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • Java如何获取平台(操作系统)的默认编码

    Java如何获取平台 操作系统 的默认编码 平台 这两个字指的就是操作系统 比如Windows平台 MacOS平台 Linux平台 这也是我们经常读API文档的时候见到的英文 platform 如 platform encoding 如何获
  • spring-MVC

    Spring MVC Hello Spring MVC web xml 在WEB INF目录下创建 web xml 配置Spring MVC的入口 DispatcherServlet 把所有的请求都提交到该Servlet
  • 数据库十一章——并发控制

    11 1 并发控制概述 1 并发操作带来的数据不一致性 1 丢失修改 Lost Update 两个事务T1和T2读入同一数据并修改 T2的提交结果破坏了T1提交的结果 导致T1的修改被丢失 2 不可重复读 Non repeatable Re