数据库系统概念 | 第十三章:事务管理 | 事务特性(ACID)| 冲突可串行化

news2024/11/14 18:30:43

文章目录

  • 📚事务的概念
    • 🐇事务定义
    • 🐇事务界定
    • 🐇事务特性(ACID)
    • 🐇一个简单的事务模型
  • 📚存储器结构
  • 📚事务的原子性和持久性
    • 🐇几种常见的事务状态
    • 🐇事务所处状态(必须处于以下之一)
  • 📚事务的隔离性
    • 🐇并发的意义
    • 🐇并发的问题
  • 📚可串行化⭐️
    • 🐇调度
    • 🐇串行调度
    • 🐇串行等价
    • 🐇可串行化的概念
    • 🐇冲突可串行化
      • 🥕非冲突操作
      • 🥕冲突操作
      • 🥕冲突等价
      • 🥕冲突可串行化
    • 🐇视图可串行化(难)
      • 🥕视图等价
      • 🥕视图可串行化
  • 📚事务的隔离性和原子性
    • 🐇可恢复调度
    • 🐇无级联调度
  • 📚事务的隔离性级别
  • 📚小结
    • 👀应试
    • 👀参考博客

📚事务的概念

🐇事务定义

访问并可能更新各种数据项的一个程序执行单元(可能是一组操作序列、一个或一段应用程序)

🐇事务界定

  • begin transaction开始事务
  • commit表示事务成功结束,对数据库的更新交付实施
  • rollback表示事务不成功结束,对数据库的更新撤消,数据库恢复该事务到初始状态。
  • end transaction结束事务

🐇事务特性(ACID)

  • 原子性一个事务是一个不可分割的工作单位,要么执行其全部操作,要么就根本不执行
  • 一致性事务必须是使数据库从一个一致性状态变到另一个一致性状态。当数据库成功提交事务的结果时,就说数据库处于一致性状态
  • 隔离性一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能相互干扰,如有干扰,要加隔离机制
    • 并发控制以事务为单位进行的
  • 持续性持续性也称永久性, 是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,后面的其它操作或故障不应对其有任何影响
  • ACID之间的关系
    • 原子性要求事务的所有操作作为一个整体,修改A与修改B两个操作要么全做,要么全不做
    • 事务执行过程中的暂时不一致性,不能影响事务的最后结果,原子性保证了事务的一致性
    • 持久性要求成功提交后,对数据库的更新是永久的,由恢复系统保证
    • 原子性和持久性由恢复系统保证

🐇一个简单的事务模型

  • read(X) :从数据库中将数据项X读到内存的缓冲区

  • write(X):从内存的缓冲区将数据X写回数据库,执行commit成功写回,执行rollback写回操作撤消

  • 一个简单的事务模型

    从帐号A取50元,存入帐号B,记为事务T
    在这里插入图片描述

    • 一致性:此例一致性要求事务T的执行结果保证数据库中A和B的和不变
    • 原子性:假设故障发生在write(A)之后write(B)之前。个账导致丢失¥50,数据不一致
    • 持久性:事务T一旦执行完成,用户被告知资金转账已经发生,系统必须保证任何故障都不会引起这次转账的数据丢失
    • 隔离性:T修改完A后,出现暂时不一致状态,此时第二个事务插进来计算A与B的和,会得错误结果,第三个事务插进来修改A、B的值,也造成错误

📚存储器结构

  • 易失性存储器
    • 驻留在易失性存储器中的信息通常在系统崩溃后不会幸存。
    • 这种存储器的示例包括主存储器和高速缓冲存储器,访问速度快
  • 非易失性存储器
    • 驻留在非易失性存储器中的信息会在系统崩溃后幸免于难。
    • 非易失性存储器的示例包括磁盘和闪存那样的二级存储设备,以及光盘和磁带那样的三级存储设备,访问速度慢
  • 稳定存储器
    • 驻留在稳定存储器中的信息永远不会丢失(应该对永远不会持有保留态度,因为理论上的永远不会是不能保证的。例如,尽管可能性非常小,也有可能出现黑洞吞噬地球从而永久地销毁所有数据!(笔者发出了哇塞的声音))
    • 为了实现稳定存储器,我们可以将信息复制到几个非易失性存储器介质(通常是磁盘)中,这些介质采用独立的故障模式

📚事务的原子性和持久性

🐇几种常见的事务状态

  • 中止:事务未能成功执行(如果要确保原子性,中止的事务必须对数据库的状态不造成影响)
  • 已回滚:中止的事务造成的变更已被撤销
  • 日志:事务对数据库所做的每个修改都会首先被记录到日志中(对日志的维护提供了通过重做修改来保证原子性和持久性的可能,以及在事务执行期间发生故障的情况下通过撤销修改来保证原子性的可能)
  • 已提交:成功完成其执行的事务。一旦事务已经提交,我们不能通过中止它来撤销其造成的影响
  • 补偿事务:撤销已提交事务所造成的影响
  • 终止:如果一个事务要么是提交的要么是中止的,它就被称为是已经终止的

🐇事务所处状态(必须处于以下之一)

  • 活跃状态,为初始状态,当事务执行时就处于这种状态
  • 部分提交状态,在最后一条语句被执行之后
  • 失效状态,在发现正常执行不能再继续之后
  • 中止状态,在事务已回滚并且数据库已被恢复到它在事务开始前的状态之后。仅当一个事务已进入中止状态,我们才说该事务已中止
  • 提交状态,在成功完成之后。只有在一个事务已进入提交状态后,我们才说该事务已提交
    ▪ 图解

📚事务的隔离性

事务处理系统通常允许多个事务并发地执行,保证所执行的任何调度都能使数据库处于一致状态,是DBS中的并发控制部件的任务

🐇并发的意义

  • 数据库资源是共享的,应允许多个用户并行地存取数据库
  • 提高吞吐量和资源利用率;减少等待时间
  • 并发操作不加控制会导致存取不正确性,破坏数据库的一致性

🐇并发的问题

  • 串行执行正确的事务,并发执行可能会出现错误
  • 控制并发事务相互影响且确保不因并发出现错误
  • 并发执行产生的数据不一致性
    • 丢失修改:事务2的提交结果破坏了事务1提交的结果,导致事务1的修改被丢失
      在这里插入图片描述

      • 数据库中A的值最后正确的结果
        ◦ T1→T2,为140
        ◦ T2→T1,为170
        ◦ T1修改的结果被T2插入后丢失了
    • 不可重复读:指事务2读取数据后,事务1执行更新操作,使事务2无法再现前一次读取结果
      在这里插入图片描述

      • T2读A值正确的结果
        ◦ T1→T2,两次都为70
        ◦ T2→T1,两次都为100
        ◦ 现在是一次100,一次70
    • 读“脏”数据:由于事务1被撤消,这时事务1已修改过的数据恢复原值,事务2原先读到的数据就与数据库中的数据不一致,是不正确的数据,又称为“脏”数据
      在这里插入图片描述

      • T2读A值正确的结果
        ◦ T1→T2,为100
        ◦ T2→T1,为100
        ◦ 现在是70
    • 脏写:如果一个数据项已经被另外一个尚未提交或中止的事务写过,则不允许对该数据项再执行写操作

📚可串行化⭐️

🐇调度

  • 一组事务的一个调度必须包含这些事务的全部指令,则称这组事务为调度
  • 写成read、write操作的序列

🐇串行调度

  • 属于同一事务的指令在调度中邻接执行n个事务的事务组,有n!个串行调度
    • 例如 ,T1 ,T2,T3三事务,有3!=6种串行调度:T1→T2→T3T1→T3→T2T2→T1→T3T2→T3→T1T3→T1→T2T3→T2→T1

🐇串行等价

  • 在并发执行中,通过保证所执行的任何调度效果都与没有并发执行的调度效果一样,可以确保数据的一致性
    • 并发执行与串行执行的效果一样,没有发生错误

🐇可串行化的概念

  • 多个事务并发执行的结果,和这组事务的某一个串行调度执行结果一致

    执行结果一致

    • 包括最终对数据库的影响
    • 包括对各事务运行的影响
    • 包括事务read到的值的影响
  • 可串行化是并发执行正确性的判定标准
    • 当且仅当调度是可串行化的时,并发调度是正确的

🐇冲突可串行化

🥕非冲突操作

  • 考虑一个调度S,S中含有分别属于事务Ti和Tj的两条连续指令I和J,以下两种情况为非冲突操作,因为交换I和J不会影响指令结果
    • Ti,Tj 对不同数据的读写操作
    • Ti,Tj对同一数据Q读操作I=read(Q)J=read(Q)

🥕冲突操作

  • 考虑一个调度S,S中含有分别属于事务Ti和Tj的两条连续指令I和J,以下三种情况为冲突操作,因为交换I和J会影响指令结果
    • 读写操作:I=read(Q)J=write(Q)
    • 写读操作:I=write(Q)J=read(Q)
    • 写写操作:I=write(Q)J=write(Q)

🥕冲突等价

  • 非冲突操作可以交换,不影响结果
  • 冲突的操作不能交换,交换产生的结果不同
  • 令I与J是调度S的连续指令,若I与J是属于不同事务的指令且I与J并不冲突,则可以交换I与J的次序来产生一个新的调度S’,称S与S’冲突等价
    在这里插入图片描述

🥕冲突可串行化

  • 概念:若一个调度S与一个串行调度S’是冲突等价的,则称调度S是冲突可串行化的
  • 优先图(也称前驱图,顺序图)判断法
    • 优先图是一个关于调度S的有向图G=(V,E)

      • V是顶点集,由参与到调度中的所有事务组成
      • E是边集,边集由满足先I=read(Q)后J=write(Q)先I=write(Q)后J=read(Q)先I=write(Q)后J=write(Q) 这三个条件之一的所有Ti→Tj的边组成
        在这里插入图片描述
    • 若图无环,S是冲突可串行化的
      在这里插入图片描述

    • 等价的串行调度是,按有向边出口依次截取结点

🐇视图可串行化(难)

🥕视图等价

  • 两个调度S、S’满足
    • ①对每个数据项Q的初值,在两个调度中是由同一个事务读产生的(S读Q的初值, S’也必须读Q的初值)
    • ②事务Ti读取的Q值,在两个调度中,都是由同一个事务写产生的(S读了写操作后的值, S‘也必须读同样写操作后的值)
    • ③Q的终值,在两个调度中是由同一个事务写
  • 则称S与S’是视图等价
  • 条件①②保证两个调度中的每个事务都读取相同的值,从而进行相同的计算
  • 条件①②③保证两个调度得到最终相同的系统状态
    在这里插入图片描述

🥕视图可串行化

  • 概念:若一个调度S与一个串行调度S’是视图等价的,则S是视图可串行化的

    • 冲突可串行调度一定是视图可串行化的
      在这里插入图片描述

    • 存在视图可串行化但非冲突可串行化的调度
      在这里插入图片描述

  • 扩展优先图

    • 原理
      • 对于先I=write(Q)后J=read(Q) ,意味着等价的串行调度是Ti→Tj
        • 如果有一个K=write(Q)存在,Tk要么在Ti之前,要么在Tj之后,否则就不是等价 Ti→Tj
        • 假定Tk在Ti之前,加一条边Tk→Ti;假定Tk在Tj之后,加一条边Tj→Tk
    • 扩展优先图(带标记)判断
      • 读写操作序列

        • T1,T2,…Ti,…Tj…表示为结点
        • 对调度S增加两个虚事务:设调度S包含了事务{T1, T2, … , Tn},设Tb, Tf是两个虚事务,其中Tb为S中所有write(Q)操作, Tf为S中所有read(Q)操作。在调度S的开头插入Tb ,在调度S的末尾插入Tf,得到一个新的调度S
          • 头事务Tb只有写操作B=write(Q)
          • 尾事务Tf只有读操作F=read(Q)
          • 调度S写成读写操作序列 S'=(B=write(Q) ... ... F=read(Q))
            在这里插入图片描述

            在这里插入图片描述
            在这里插入图片描述
            在这里插入图片描述

      • ⭐️如果无(有向)环,是视图可串行化的调度⭐️

      • ⭐️如果去掉P标记边对的一条,无(有向)环,也是视图可串行化调度⭐️

      • ⭐️等价的串行调度是,按有向边出口依次截取结点⭐️

📚事务的隔离性和原子性

🐇可恢复调度

  • 不可恢复性调度:需要恢复时,因为部分调度已经中止,而导致调度无法恢复至原状态
    • 示例:如果T1在R(B)之后,希望rollback,则无法处理,因为T2已经提交
  • 可恢复性调度:对每对事务Ti和Tj,如果Tj读了之前由Ti写的数据,则Ti 必须先于Tj提交
    • 示例:如果需要rollback,则调度重新开始即可

🐇无级联调度

  • 级联回滚:因单个事务失效而导致一系列事务回滚的现象称为级联回滚
  • 无级联调度:不会出现级联回滚的调度,称无级联调度(避免大量回滚操作)
  • 措施:如果 T j T_j Tj要读 T i T_i Ti写的数据,则 T j T_j Tj必须等 T i T_i Ti提交完成后再读(即:不读脏数据)

📚事务的隔离性级别

  • 为提高并发度,可采用较弱级别的一致性(SQL标准规定的隔离性级别)
    • 可串行化:通常保证可串行化的执行。一些数据库系统以在某些情况下可能允许非可串行化执行的方式来实现这种隔离性级别
    • 可重复读:只允许读取已提交的数据,并进一步要求在一个事务两次读取一个数据项期间,其他事务不得更新该数据项。但是,该事务对于其他事务来说可能不是可串行化的。例如,当一个事务在查找满足某些条件的数据时,它可能找到一些由一个已提交事务所插入的数据,但可能找不到由同一个事务所插入的其他数据
    • 已提交读:只允许读取已提交数据,但并不要求可重复读。例如,在事务两次读取一个数据项期间,另外的事务可以更新该数据项并提交
    • 未提交读:允许读取未提交数据。这是SQL允许的最低隔离性
    • 以上所有的隔离性级别附带都不允许脏写,即如果一个数据项已经被另外一个尚未提交或中止的事务写过,则不允许对该数据项再执行写操作
  • 隔离性级别的实现
    • 并发控制(详见第十四章)
    • 锁(两阶段封锁协议)
    • 时间戳(读时间和写时间)
    • 基于有效性检查的协议
    • 多版本和快照隔离

📚小结

👀应试

方法

  • E是边集,边集由满足先I=read(Q)后J=write(Q)先I=write(Q)后J=read(Q)先I=write(Q)后J=write(Q) 这三个条件之一的所有Ti→Tj的边组成
  • 若图无环,S是冲突可串行化的
  • 等价的串行调度是,按有向边出口依次截取结点

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

👀参考博客

如何画前趋图?
视图可串行化
冲突可串行化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MDA260-16-ASEMI整流模块MDA260-16

编辑-Z MDA260-16在MDA封装里采用的2个芯片,是一款单臂共阳极整流模块。MDA260-16的浪涌电流Ifsm为11000A,漏电流(Ir)为15mA,其工作时耐温度范围为-40~150摄氏度。MDA260-16采用GPP硅芯片材质,里面有2颗芯片组成。MDA260-16的电性…

转行大数据开发应该怎么学习

转行进入大数据,首先需要了解的就是大数据是做什么,工作内容,然后就是找个完整的学习路线跟着去学习了,大数据的学习内容也是不少的~ 简单来说,分为6步,大数据开发入门,大数据核心基础&#xf…

【iHooya】2023年2月2日寒假作业解析

#include <bits/stdc.h> using namespace std;int main() {int n, r; //n个人&#xff0c;r个水龙头cin >> n >> r;int time[n];for (int a 0; a < n; a){cin >> time[a];}sort(time, time n); //时间从小到大排序int minx 0, lt_time[10001], j…

程序全过程:觉醒(序)

程序全过程序很惭愧&#xff0c;写了几年的程序&#xff0c;技术的功力没有太大增长&#xff0c;只是在项目的熟悉程度上有不少进步。因为上学时没好好学&#xff0c;很多现在工作中用到的编程技能都是在工作中边学边用的&#xff0c;相当于一直处于临时抱佛脚的状态&#xff0…

iptables端口复用

环境&#xff1a; 攻击主机&#xff1a;Kali -- 192.168.218.135 目标主机&#xff1a;RHEL8 -- 192.168.218.129 什么是端口复用 端口复用是指不同的应用程序使用相同端口使用相同端口进行通讯。 场景 目标主机是Linux系统&#xff0c;目标主机防火墙有严格的限制&#…

【FAQ】申请运动健康服务验证环节常见问题及解答

华为 HMS Core 运动健康服务&#xff08;HUAWEI Health Kit&#xff09;提供原子化数据开放。应用在获取用户数据授权后&#xff0c;可通过接口访问运动健康数据&#xff0c;对用户数据进行读写等操作&#xff0c;为用户提供运动健康类数据服务。 开发者应用在开发和测试阶段访…

SGI STL二级空间配置器源码剖析(2)

接着上回&#xff0c;这节开始说allocte内存分配的实现 目录 allocate源码流程&#xff1a; _S_refill 的实现&#xff1a; _S_chunk_alloc的实现&#xff1a; deallocate&#xff1a; reallocate&#xff1a; 二级空间配置器的逻辑步骤&#xff1a;假如现在申请n个字节&…

选择计算机专业,必看的10条自学建议

选择了计算机专业&#xff0c;很迷茫&#xff0c;没事&#xff01;&#xff01;博主整理了关于学习计算机的十条自学经验&#xff0c;从各个方面阐述了如何学习计算机专业。 1、学会使用Google搜索&#xff0c;放弃百度&#xff0c;你会发现Google 会搜出更多有用的答察&#x…

车规级MCU缺货持续2年多,上海航芯持续加码市场

MCU是传统燃油车的重要芯片之一&#xff0c;在电动车领域&#xff0c;MCU也有着广泛的应用&#xff0c;且随着汽车电子化的持续发展&#xff0c;车用MCU的市场规模还将随之持续扩大&#xff0c;据 IC insights 数据显示&#xff0c;至2026年&#xff0c;全球车规级MCU的市场规模…

C++——函数重载,引用

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;补充C语言语法的不足&#…

【Kubernetes】记录一次K8S容器内程序OOM排查过程:unable to create new native thread

文章目录项目背景问题初现问题排查问题定位问题解决项目背景 基于k8s的容器化kafka PaaS管理平台&#xff0c;业务团队申请kafka&#xff0c;通过一系列操作&#xff0c;封装crd&#xff0c;调用operator创建集群&#xff0c;当然还包括其他功能、topic管理、group管理、监控告…

年后上来面试了13家企业软件测试岗位,面试题整理

软件测试面试&#xff0c;800多道高频面试真题&#xff0c;随便刷。&#xff08;希望能帮助大家&#xff09;项目的测试流程 1. 拿到需求文档后&#xff0c;写测试用例 2. 审核测试用例 3. 等待开发包 4. 部署测试环境 5. 冒烟测试&#xff08;网页架构图&#xff09; 6.…

CSS中height:100vh和height:100%的区别是什么?

CSS中height:100vh和height:100%的区别 首先&#xff0c;我们得知道1vh它表示的是当前屏幕可见高度的1/100&#xff0c;而1%它表示的是父元素长或者宽的1%&#xff08;可以这么理解&#xff1f;&#xff09; 1、对于设置height:100%;有下面几种情况&#xff1a; &#xff08…

如何使用Maven快速构建JavaWeb项目?在idea中使用TomCat详细解读

文章目录1. 前言2. Web项目的结构3. 创建Maven Web项目4. 在IDEA中使用TomCat4.1 集成本地TomCat4.2 使用TomCat Maven插件5. 总结&#x1f4c2;橙子精品文章学习推荐1. 前言 前面在 Web 服务器 TomCat 快速入门一文中&#xff0c;我们介绍了 Web 服务器的基本概念以及 TomCat…

工业平板电脑实现工厂自动化设备无需手动连接

随着中国经济的快速发展和材料水平的不断提高&#xff0c;制造业的竞争日益激烈&#xff0c;市场竞静力逐渐转向质量、效率和价格服务&#xff0c;制造业企业面临更大的挑战&#xff0c;数据转型迫在眉睫。对工业平板电脑的需求也在增加&#xff0c;面向行业的工业平板电脑已成…

Java设计模式--工厂模式

目录 1.简单工厂模式 1.1类图 1.2 代码示例 2.工厂方法模式 2.1 类图 2.2 代码示例 3.抽象工厂模式 3.1 类图 3.2 代码示例 实际应用&#xff1a; 总结&#xff1a; 1.简单工厂模式 定义了一个创建对象的类&#xff0c;由这个类来封装实力化对象的行为。 1.1类图 1.…

《三体》中罗辑所说的定位行星的位置,是怎样实现的?

最近流浪地球2&#xff0c;三体电视剧火得一塌糊涂&#xff0c;《三体》中罗辑用咒语标记了三体星系位置&#xff0c;利用黑暗森林理论与三体人对峙长达两百年&#xff0c;那么这种定位技术在现实中是否存在呢&#xff1f;咒语标记三体星系位置这件事&#xff0c;听起来很玄乎但…

vite兼容chrome48的方法

chrome48不支持async await语法&#xff0c;但有些桌面客户端的内嵌浏览器就是chrome48,如下操作即可兼容 当前环境&#xff1a;2023-2-3使用npm create vitelatest创建 开始兼容操作 安装vite推荐的 vitejs/plugin-legacy 文档官网 https://github.com/vitejs/vite/tree/m…

【JavaEE】HTTP的方法、报头、状态码

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:http请求的方法、报头&#xff1b;状态码&#xff01; &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE代码&#…

学习QCustomPlot【4】库官方examples之plots解读

文章目录一、前言二、案例解说0&#xff1a;Quadratic Demo【二次曲线demo】1、Simple Demo【简单demo】2、Sinc Scatter Demo【Sinc函数散点demo】3、Scatter Style Demo【散点样式demo】4、Line Style Demo【线型demo】5、Scatter Pixmap Demo【图标散点demo】6、Date Demo【…