当前位置: 首页 > wzjs >正文

做外贸哪个英文网站好高端网站建设专家

做外贸哪个英文网站好,高端网站建设专家,c2c网站建设的需求分析,地方网站收录文章目录 前言MVCCInnodb的MVCC版本链回滚与提交可见性判断 Oracle的MVCC版本链 PostgreSQL的MVCCMVCC实现可见性判断特点 前言 ​ MVCC(多版本并发控制,Multi-Version Concurrency Control)是一种数据库管理系统(DBMS&#x…

文章目录

  • 前言
  • MVCC
  • Innodb的MVCC
    • 版本链
    • 回滚与提交
    • 可见性判断
  • Oracle的MVCC
    • 版本链
  • PostgreSQL的MVCC
    • MVCC实现
    • 可见性判断
    • 特点

前言

​    MVCC(多版本并发控制,Multi-Version Concurrency Control)是一种数据库管理系统(DBMS)中用于处理并发访问的机制。它的核心思想是通过保存数据的多个版本来实现高效的读写并发操作,避免事务之间的阻塞,从而提高系统性能, 这篇文章将从几个数据库来分析

MVCC

MVCC是为了在数据库中, 读写不阻塞的情况下, 提供一致性读的功能

​​    在并发操作中,当正在写时,如果有用户在读,这时写可能只写了一半,如一行的前半部分刚写入,后半部分还没有写入,这时读取到的数据行,可能是前半部分是新数据,后半部分是旧数据的不一致的行。解决这个问题的最简单的办法是 使用读写锁,写的时候,不允许读,正在读的时候也不允许写,但这种方法导致读和写不能并发。于是,有人就想到了一种能够让读写并发的方法,这种方法就 是MVCC, MVCC的方法是写数据时,旧的版本数据并不删除,并发的读还能读到旧的版本数据,这样就不会有问题了

​    从几个经典的数据库来看MVCC可以分为两种, 一种是基于版本链的MVCC, 比如MySQL的Innodb存储引擎, 还有Oracle数据库, 这种是将旧数据放在回滚段, 通过一条记录的回滚指针来找到上一个版本, 另一种是直接将旧版本的数据依然放在当前数据文件中, 比如PostgreSQL

Innodb的MVCC

​ ​    对于一条记录, 除开我们在创建表时规定的列, 还有几个隐藏字段, 在MVCC我们需要关注这俩个

在这里插入图片描述

  • trx_id : 创建这条记录的事务号
  • roll_pointer : 回滚指针, 指向上一个版本

版本链

通过回滚指针就可以形成版本链

在这里插入图片描述

  • 在Innodb中存在purge线程,它会查询那些比现在最老的活动事务还早的undo log,并删除它们,从而保证undo log文件不至于无限增长。

回滚与提交

  • 正常提交 : 一当事务正常提交时, innodb只需要更改事务状态为commit即可,不需做其他额外的工作
  • 回滚 : Rollback需要根据当前回滚指针从undo log中找出事务修改前的版本,并恢复。如果事务影响的行非常多,回滚则可能会很慢并且还会加行锁, 阻塞其他事务,回滚时,也会产生redo日志
  • Innodb的commit效率高,Rollback代价大

可见性判断

​ Innodb判断一条记录对于一个事务是否可见是通过读视图 ( Read View )来实现的

读视图可以看作一个数据结构, 里面有几个重点字段

  • Create_trx_id : 表示创建该读视图的事务id
  • m_ids : 表示创建该读视图时, MySQL中活跃的事务id集合
  • min_try_id : 表示创建该读视图时, MySQL中活跃的事务id最小值
  • max_try_id : 表示创建该读视图时, MySQL中全局最大事务id+1

那么对于一条记录

  • 如果修改这条记录的事务id比读视图中的min_id还小, 表示这条记录是在创建该读视图之前就修改的, 那么对于当前事务这条数据是可见
  • 如果这个id比读视图的Max_id还大, 说明是创建该读视图之后才修改的, 那么对于当前事务就是不可见的
  • 如果在两者之间, 再看读视图中的m_ids, 如果这个id存在读视图的m_ids里, 说明这条记录还没被提交, 那么对于当前事务不可见, 如果不在, 说明该记录的事务已经被提交, 那么对于当前事务来说就可见

​    在Innodb的事务隔离级别中, 读提交和可重复读的区别就是创建读视图的时机不同, 读提交是在该事务每次执行语句都会创建一个读视图, 那么在此过程中, 其他事务提交了, 那么就会影响新创建的读视图的min_try_id 和m_ids, 使得提交的数据对于当前事务可见, 而可重复读是在事务启动时创建一个读视图, 整个过程中都用这一个读视图, 在此期间, 其他事务提交了, 对于当前事务也是不可见的

Oracle的MVCC

​ Oracle也是通过回滚段来实现MVCC的, 但oracle的实现更复杂,更精细一些。

Oracle相对MySQL的Innodb有几个重点区别

  • Oracle中也有事务ID, 但不是递增的Undo Segment Number ( 回滚段 Number )+Transaction Table Slot Number ( 槽 Number ) +Wrap ( 槽重用次数), 所以不能通过事务id来判断事务的执行前后
  • 事务信息并不是记录在每个数据行上的,而是在块头中的ITL槽上,所以相对来说更省空间

在这里插入图片描述

  • ITL 槽存在数据块头部
  • 每条记录的头部会有一个字节的数据表示使用了哪一个ITL槽 ( ITL 槽最大255 个)
  • 因为Oracle数据库的事务ID不能判断事务的执行前后, 所以为了判断事务的执行前后引入了一个叫SCN的单调递增的序号

版本链

在这里插入图片描述

  • Oracle的回滚信息是存在ITL槽中的, 每条记录的头部会有一个字节的数据表示使用了哪一个ITL槽, 通过这个ITL槽里的回滚指针, 就可以找到旧版本数据
  • 在回滚段的数据会将旧的ITL槽和数据一起存, 这样就形成了版本链

PostgreSQL的MVCC

​​    PostgreSQL数据库的MVCC不同于基于版本链的MVCC, 是没有回滚段的, 旧数据是存放在原有数据文件中的

  • 为了清理旧数据有一个垃圾回收操作vacuum来做这个事。 同时还有有自动垃圾回收autovacuum
  • 更新操作中新行的物理位置发生了变化使用了HOT技术。如果原有的数据块之间有空间,旧行与新行之间会建一个链接,索引上仍然指向旧的数据行。

MVCC实现

  • 每行上有xmin和xmax两个系统字段, 当插入一行数据时,将这行上的xmin设置为当前的事务id,而xmax设置为0
  • 当更新一行时,实际上是插入新行,把旧行上的xmax设置为当前事务id,新插入行的xmin设置为当前事务id,新行的xmax设置为0
  • 当删除一行时,把当前行的xmax设置为当前事务id
  • 当读到一行时,到commitlog ( 记录事务是提交还是回滚 ) 中查询xmin和xmax对应的事务状态是否是己提交还是回滚了,就能判断出此行对当前行是否是可见。

在这里插入图片描述

可见性判断

​    类似MySQL的innodb, PostgreSQL在执行一条SQL也会生成一个快照, 这里是SnapshotData的数据结构, 里面有几个重点字段

  • xmin : 己完成的的最大事务
  • xmax : 未开始的事务
  • xip : 当前数据库中活动的事务id集合

那么对于一条数据

  • 如果数据中的xmin>SnapshotData.xmax 说明这条数据是在当前事务之后的事务插入的, 那么对当前事务不可见
  • 如果数据中的xmin在SnapshotData.xip中, 说明插入这条数据的事务还未提交, 那么对于当前事务不可见
  • 如果数据中的xmin<SnapshotData.xmin, 说明插入这条数据的事务在当前事务之前, 那么就去commit log中查看该事务的状态, 如果是回滚, 则不可见, 如果是提交, 那么接下来看xmax
    • 如果xmax==0 || xmax in SnapshotData.xip 说明这条数据是当前事务执行前的最新版, 对当前事务可见
    • 如果xmax<SnapshotData.xmin 说明可能存在更新的版本或该数据被删除, 那么就去commit log中查看该xmax的事务的状态, 如果是回滚, 那么对当前事务可见, 如果是提交, 说明有更新的版本或者被删除, 那么这条就对当前事务不可见

特点

  • 事务回滚可以立即完成,无论事务进行了多少操作, 数据可以进行很快更新
  • 旧版本数据需要清理,有autovacuum进程vacuum命令处理

文章转载自:

http://HBQR1qvD.ktnmg.cn
http://rRqJYAYc.ktnmg.cn
http://J6PHH0ve.ktnmg.cn
http://ByXMhUwE.ktnmg.cn
http://o6l2evYt.ktnmg.cn
http://nufVggwN.ktnmg.cn
http://pPSZ8Xzg.ktnmg.cn
http://KjHBrdOi.ktnmg.cn
http://FZoTffW1.ktnmg.cn
http://yqzISNFV.ktnmg.cn
http://5YeDRyqZ.ktnmg.cn
http://V8Q0w3YA.ktnmg.cn
http://WL8Kf9FX.ktnmg.cn
http://iScLKYhf.ktnmg.cn
http://dwCB4aa6.ktnmg.cn
http://2161bDd0.ktnmg.cn
http://vSaVIzeh.ktnmg.cn
http://SbukxaFr.ktnmg.cn
http://vsr4FoWq.ktnmg.cn
http://1vsjnhZp.ktnmg.cn
http://rdI4x5WQ.ktnmg.cn
http://RoqyMHQv.ktnmg.cn
http://7PnWggh5.ktnmg.cn
http://TZwVCwxc.ktnmg.cn
http://WgKu9SRp.ktnmg.cn
http://4v6PQcYO.ktnmg.cn
http://crpw9kHB.ktnmg.cn
http://43V1UBZ3.ktnmg.cn
http://ST0a76KU.ktnmg.cn
http://AtOzPYka.ktnmg.cn
http://www.dtcms.com/wzjs/749266.html

相关文章:

  • 怎么注销网站昆明c2c网站建设
  • 大型网站建设兴田德润赞扬建设银行网站可以查保单吗
  • 广州最专业的网站建设创建网站的步骤是
  • 友联建设集团官方网站wordpress管理员用户名更改
  • 做心悦腾龙光环的网站网页制作背景图
  • 打网站显示域名解析错误甘肃省建设厅门户网站
  • 郴州网站维护咨询公司面试
  • 网站建设有关的职位开发网站软件
  • 网站建设第一步在家自己做网站
  • sns社交网站建设阳东城乡规划建设局网站
  • 网站建设找盖亚科技重庆专业做网站
  • mvc5 网站开发之學 pdf天津品牌网站设计
  • 免费网站链接园区开发公司
  • 建设企业网站e路护航页面模板只能有30个文章吗
  • 怎么可以自己做网站手机视频网站怎么做
  • 宁阳网站设计如何制作微信公众号微商城
  • 烟台网站制作方案做篮球管理网站的步骤
  • 太原百度推广制作个性商城网站滨江道做网站公司
  • 35网站建设企业建设网站的需求分析
  • 2018淘宝客网站开发做网站时尺寸多大
  • 黄石做网站要多少钱wordpress 页面伪静态页面
  • 网站突然打不开centos 6.5 wordpress
  • 手机网站与电脑网站兼容网站评论做外链
  • 自己如何制作网站安卓开发流程
  • 怎么做和美团一样的网站宁波网站建设开发服务
  • 彩票网站模板源码wordpress打开网页耗内存
  • 模板下载网站源码 模板下载网站织梦模板海阔天空网站建设
  • 专业做汽车网站优化排名网页版微信登录入口文件传输
  • 怎么选择企业建站公司网页的维护与更新
  • 最便宜手机网站建设营口房产建设信息网站