返回顶部
首页 > 资讯 > 前端开发 > VUE >一致性读实现原理是什么
  • 535
分享到

一致性读实现原理是什么

2024-04-02 19:04:59 535人浏览 泡泡鱼
摘要

本篇内容主要讲解“一致性读实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一致性读实现原理是什么”吧!MySQL中的事务事务在RDBMS系统中概念基

本篇内容主要讲解“一致性读实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一致性读实现原理是什么”吧!

MySQL中的事务

事务在RDBMS系统中概念基本都是一样的,是由一组DML语句构的工作单元,要么全部成功,要么全部失败。

一致性读实现原理是什么

开发过程中,比较关心长事务,即包含DML语句多的工作单元,事务太长会导致一些错误,例如可能由于事务数据包大小超过参数max_allowed_packet设置会导致程序报错,也可能有事务中某个sql对应接口报错,导致整个服务调用失败,在程序设计时,应该考虑避免长事务带来的业务影响。

事务的ACID

一致性读实现原理是什么

image-20201114221841801

原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性。

事务的并发问题

  • 脏读:事务A读取了事务B未提交的数据。

  • 不可重复度:事务A多次读取同一份数据,事务B在此过程中对数据修改并提交,导致事务A多次读取同一份数据的结果不一致。

  • 幻读:事务A修改数据的同时,事务B插入了一条数据,当事务A提交后发现还有数据没被修改,产生了幻觉。

不可重复读侧重于update操作,幻读侧重于insert或delete。解决不可重复读的问题只需住满足条件的行,解决幻读需要锁表。

事务隔离级别

事务隔离是数据库处理的基础之一,隔离级别在多个事务同时进行更改和执行查询时,对性能与结果的可靠性、一致性和可再现性之间的平衡进行调整,InnoDB利用不同的锁策略支持不同隔离级别。Mysql中有四种隔离级别,分别是读未提交(READ  UNCOMMITTED),读已提交(READ COMMITTED),可重复读(REPEATABLE READ)以及串行化(SERIALIZABLE)。

隔离级别脏读不可重复读幻读
READ UNCOMMITTEDYesYesYes
READ COMMITTEDNoYesYes
REPEATABLE READNoNoYes
SERIALIZABLENoNoNo

InnoDB并发控制

MVCC特性

InnonDB是一个支持行锁的存储引擎,为了提供更好支持的并发,使用了非锁定读,不需要等待访问数据上的锁释放,而是读取行的一个快照,该方法是通过InnonDB  mvcC特性实现的。

MVCC是Multi-Version Concurrency  Control的简称,即多版本并发控制,作用是让事务在并行发生时,在一定隔离级别前提下,可以保证在某个事务中能实现一致性读,也就是该事务启动时根据某个条件读取到的数据,直到事务结束时,再次执行相同条件,还是读到同一份数据,不会发生变化。

MVCC的好处

读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,可以增加系统的并发性能。

在MVCC中,有两种读操作:快照度和当前读。

一致性读实现原理是什么

MVCC快照

MVCC内部使用的一致性读快照称为Read  View,在不同的隔离级别下,事务启动时或者SQL语句开始时,看到的数据快照版本可能也不同,在RR、RC隔离级别下会用到 Read view。

一致性读实现原理是什么

InnoDB 里面每个事务有一个唯一的事务ID,称为Transaction  ID,它是在事务开始的时候向InnoDB的事务系统申请的,是按申请顺序严格递增的。而每行数据都有多个版本。每次事务更新数据的时候,都会生成一个新的数据版本Read  View,并且把Transaction ID赋值给这个数据版本的事务 ID,标记为  row_trx_id。同时旧的数据版本要保留,并且在新的数据版本中,能够有信息可以直接拿到它,数据表中的一行记录,其实可能有多个数据版本 ,每个版本有自己的  row_trx_id。

InnoDB行格式

目前InnoDB默认的行格式Dynamic,是Compat格式的增强版,记录头结构信息占用5个字节,事务ID和回滚指针分别占用6和7个字节,行格式如下:

一致性读实现原理是什么

记录头结构

项目大小(bit)描述
()1Unknown
()1Unknown
deleted_flag1数据行删除标记
min_rec_flag1=1如果该记录被预先被定义为最小的记录
n_owned4拥有的记录数
heap_no13索引堆中该条记录的排序位置
record_type3记录类型;000:普通,001:B+树叶子节点,010:伪列Infinum,011:Supernum,1xx:保留
next_record16page中下一条记录的相对位置
Transaction ID48记录中的事务ID,固定6个字节
Rollback Pointer56回滚指针,固定7个字节

数据行存储

#创建表 mysql> create table store_users (id int not null auto_increment primary key comment '主键id',name varchar(20) not null default '' comment '姓名'); # 查看表状态信息 mysql> show table status like 'store_users'\G      Row_fORMat: Dynamic    #默认行格式为Dynamic            Rows: 0          #行数  Avg_row_length: 0          #平均行长度     Data_length: 16384      #初始化段大小16K      #开启事务,插入数据 mysql> begin; mysql> insert into store_users values(null, 'aaaaa'),(null, 'bbbbb'); #查看InnoDB分配的事务ID mysql> select trx_id from information_schema.innodb_trx\G trx_id: 8407246  #事务ID

分析表的行头信息以及隐藏的事务ID和回滚指针。

# 用linux下的工具hexdump进行分析 $ hexdump -C -v /usr/local/var/mysql/test/store_users.ibd > store_users.txt  $ vi store_users.txt 00010060  02 00 1b 69 6e 66 69 6d  75 6d 00 03 00 0b 00 00  |...infimum......| 00010070  73 75 70 72 65 6d 75 6d  05 00 00 10 00 1c 80 00  |supremum........| 00010080  00 01 00 00 00 80 48 ce  83 00 00 01 d8 01 10 61  |......H........a|   #Record Header信息 00010090  61 61 61 61 05 00 00 18  ff d6 80 00 00 02 00 00  |aaaa............| 000100a0  00 80 48 ce 83 00 00 01  d8 01 1d 62 62 62 62 62  |..H........bbbbb| 000100b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  • 10表示变长字段长度,只有一个varchar(20)没有超过256字节,且没有NULL值。

  • 00代表NULL标志位,第一行没有为NULL数据。

  • 字符a的十六进制是61,即61 61 61 61 61代表的是字段值aaaaa

  • 00 00 00 80 48 ce 6个字节就是Transaction  ID,转换成十进制8407246,正是上面information_schema.innodb_trx.trx_id列的值,trx_id: 8407246  。

  • 83 00 00 01 d8 01 10 7个字节是Rollback Pointer。

  • 1c 80 00 00 01 是5个字节,代表Record Header信息。

隔离级别与快照

REPEATABLE READ

默认的隔离级别,一致读快照(Read View)是在第一次SELECT发起时建立,之后不会再发生变化。如果在同一个事务中发出多个非  锁定SELECT语句,那么这些SELECT语句在事务提交前返回的结果是一致的。

一致性读实现原理是什么

在RR下快照Read View不是事务发起时创建,而是在第一个SELECT发起后创建。

一致性读实现原理是什么

READ COMMITTED

在READ COMMITTED读已提交下,一致读快照(Read View)是在每次SELECT后都会生成最新的Read  View,即每次SELECT都能读取到已COMMIT的数据,就会存在不可重复读、幻读 现象。

一致性读实现原理是什么

Undo回滚段

一致性读实现原理是什么

当开启事务执行更新语句(insert/update/deeldte),会经过Server层的处理生成执行计划,然后调用存储引擎层接口去读写数据,用户没有触发COMMIT或ROLLBACK之前,这些Uncommitted  Data的数据称为前镜像(Post Image),数据存储在Undo Log,以便用户回滚或者MySQL Server Crash的恢复,同时Undo  Log是循环覆盖使用。

#开启事务,更新账户余额,不提交事务。 mysql> start transaction; mysql> update account set balance = 100000 where account_no = 10001; Rows matched: 1  Changed: 1  Warnings: 0

上面在RR隔离级别下,开启一个事务,做update更新操作,不提交事务,通过show engine innodb  status\G查看undo情况。

Trx id counter 8407258 Purge done for trx's n:o < 8407257 undo n:o < 0 state: running but idle History list length 33 ...... ---TRANSACTION 8407257, ACTIVE 154 sec 2 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1

Trx id counter 8407258当前的事务ID,undo log entries 1使用了的undo entries,ACTIVE 154  sec事务持续时间,事务commit后,会调用Purge Thread把undo中的老数据清理掉。

回滚记录

insert:反向操作是delete,undo里记录的是delete相关信息,存储主键id即可。

udpate:反向操作是update,undo里记录的是update前的相关数据。

delete:反向操作是insert,undo里记录的是insert values(&hellip;..)相关的记录。

从这里可以知道,更新操作占用Undo空间的大小排序如下:

delete > update > insert

所以不建议物理delete删除数据,会产生大量的Undo  Log,Undo快被写满就会发生切换,在次期间会有大量的IO操作,导致业务的DML都会变得很慢。

一致性读

MySQL官方文档对一致读的描述:

一致性读实现原理是什么

读操作基于某个时间点得到一份那时的数据快照,而不管同时其他事务对数据的修改。查询过程中,若其他事务修改了数据,那么就需要从 undo  log中获取旧版本的数据。这么做可以有效避免因为需要加锁(来阻止其他事务同时对这些数据的修改)而导致事务并行度下降的问题。

在可重复读(REPEATABLE READ,简称RR)隔离级别下,数据快照版本是在第一个读请求发起时创建的。在读已提交(READ  COMMITTED,简称RC)隔离级别下,则是在每次读请求时都会重新创建一份快照。

一致性读是InnoDB在RR和RC下处理SELECT请求的默认模式。由于一致性读不会在它请求的表上加锁,其他事务可以同时修改数据不受影响。

一致性读实现原理是什么

一行数据有多个版本,每个数据版本有自己的trx_id,每个事务或者查询通过trx_id生成自己的一致性视图。普通select语句是一致性读,一致性读会根据row  trx_id和一致性视图确定数据版本的可见性,图中UR1,UR2就是undo,存储在Undo Log中,每次查询时根据当前data page和 Undo  page构造出一致性数据页(Consistent Read Page),通过读取CR Page将数据返回给用户。

到此,相信大家对“一致性读实现原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 一致性读实现原理是什么

本文链接: https://lsjlt.com/news/84281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一致性读实现原理是什么
    本篇内容主要讲解“一致性读实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一致性读实现原理是什么”吧!MySQL中的事务事务在RDBMS系统中概念基...
    99+
    2024-04-02
  • 什么是数据库的读一致性和写一致性
    一、读一致性 读一致性是指在数据库中的并发读操作中,读取到的数据应该是一致的。具体来说,当一个事务在执行读取操作时,如果另一个事务正在对同一数据进行修改(写操作),那么读取操作应该获取到已经提交的最新版本的数据,而不是读取到部分修改完成的数...
    99+
    2023-10-29
    数据库 读一致性 写一致性
  • mysqldump一致性热备的原理是什么
    mysqldump一致性热备的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先用mysqldump执行一次一致性备份:$ ...
    99+
    2024-04-02
  • Oracle读写一致性的概念是什么
    Oracle读写一致性是指在数据库系统中,当一个事务对数据进行更新后,其他事务在读取该数据时能够看到该更新后的最新值,而不会看到部分...
    99+
    2024-04-19
    Oracle
  • MySQL半一致性读原理的示例分析
    小编给大家分享一下MySQL半一致性读原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 1、什么是半一致性读A t...
    99+
    2024-04-02
  • Java实现读写锁的原理是什么
    本文小编为大家详细介绍“Java实现读写锁的原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现读写锁的原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。读/写锁Java实现首先我们总结一...
    99+
    2023-06-29
  • 如何理解MySQL的一致性读
    如何理解MySQL的一致性读,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一 前言   ...
    99+
    2024-04-02
  • 怎么理解Innodb一致性非锁定读
    这篇文章主要讲解了“怎么理解Innodb一致性非锁定读”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Innodb一致性非锁定读”吧!一致性非锁定读指...
    99+
    2024-04-02
  • Cassandra怎么处理读写一致性问题
    Cassandra是一个高性能、分布式数据库系统,它采用了基于CAP理论的分布式设计。在Cassandra中,读写一致性问题通常通过...
    99+
    2024-04-02
  • 什么是事务的一致性
    什么是事务的一致性?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。事务的一致性是指:事务必须是使数据库从一个一致性状态变到另一个一致性状态。为了...
    99+
    2024-04-02
  • 什么是Java一致性Hash算法
    这篇文章主要介绍“什么是Java一致性Hash算法”,在日常操作中,相信很多人在什么是Java一致性Hash算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Java一...
    99+
    2024-04-02
  • 什么是Cassandra的一致性级别
    Cassandra的一致性级别是指在对数据库进行读写操作时,系统保证数据的一致性的程度。Cassandra提供了三种一致性级别: ...
    99+
    2024-03-06
    Cassandra
  • mysql事务特性的实现原理是什么
    MySQL事务特性的实现原理是通过使用日志和锁机制来保证事务的原子性、一致性、隔离性和持久性。1. 原子性:MySQL使用redo日...
    99+
    2023-10-12
    mysql
  • 一文了解什么是CDN及实现原理
    目录正文dns解析流程让我们来一步步分析解析流程:腾讯云cdn实例正文 由于用户访问源站业务有性能瓶颈,通过cdn技术把源站的内容缓存到多个节点。用户向源站域名发起请求时,请求会被调...
    99+
    2023-05-19
    CDN实现原理 什么是CDN
  • redis的一致性hash和hash槽是什么
    这篇文章主要讲解了“redis的一致性hash和hash槽是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis的一致性hash和hash槽是什么”...
    99+
    2024-04-02
  • MongoDB中实现原理是什么
    今天就跟大家聊聊有关MongoDB中实现原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。主流程MyCAT Server 接收 MySQL C...
    99+
    2024-04-02
  • CAS的实现原理是什么
    本篇内容主要讲解“CAS的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CAS的实现原理是什么”吧!悲观锁与乐观锁悲观锁总是假设最坏的情况,线程a...
    99+
    2024-04-02
  • LongAdder的实现原理是什么
    LongAdder的实现原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。AtomicLong的实现原理图:LongAdder是JDK8...
    99+
    2024-04-02
  • SSH的实现原理是什么
    本篇内容介绍了“SSH的实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SSH是一种协议标准,它的主要目的是实现远程登录和提供安...
    99+
    2023-06-17
  • CountDownLatch的实现原理是什么
    这篇文章主要讲解了“CountDownLatch的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CountDownLatch的实现原理是什么”吧! 前言CountDo...
    99+
    2023-06-15
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作