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

网站建设太金手指六六二五深圳市龙华区

网站建设太金手指六六二五,深圳市龙华区,代理网页游戏需要什么条件啊,初学php者网站首页怎么做目录 1 概述 2 四大特性 2.1 原子性 2.2 隔离性 2.2.1 MVCC 2.2.2 undolog---MVCC 2.2.3 Read View---MVCC 2.3 持久性 2.3.1 二阶段提交 2.4 一致性 1 概述 相信大家刚接触mysql的时候,就知道mysql事务的四个特点,原子性,持久…

目录 

1 概述 

2 四大特性

2.1 原子性

2.2 隔离性

2.2.1 MVCC

2.2.2 undolog---MVCC

2.2.3 Read View---MVCC

2.3  持久性

2.3.1 二阶段提交

2.4 一致性


1 概述 

        相信大家刚接触mysql的时候,就知道mysql事务的四个特点,原子性,持久性,隔离性和一致性,但是大家是否有想过它们是如何如何靠着4个特性去解决mysql中常见问题的呢?最近查阅了一些资料,写篇博客记录一下。mysql的事务的实现方式和mysql的日志系统有关。 

原子性(Atomicity):语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的。实现主要基于undo log日志。

一致性(Consistency):事务追求的最终目标,一致性的实现即需要数据库层面的保障,也要应用层面的保障。

隔离性(Isolation):保证事务执行尽可能不受其他事务影响。InnoDB默认的隔离级别是可重复读

持久性(Durability):保证事务提交后不会因为宕机等原因导致数据丢失。实现主要基于redo log。

2 四大特性

2.1 原子性

原子性(Atomicity):语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的。实现主要基于undolog日志。

        对于mysql来说,同一个事物可以包含很多条sql语句,但如果前面几条sql执行成功了,但最后一条执行失败了,那么这个时候前面几条执行成功的sql语句也要回滚到之前的历史版本里面。只要保证了这个就可以保证事务的原子性。那么如何来操作呢?

保留之前数据的历史状态,只要没有提交,当需要回滚时,将历史数据拿来重新进行覆盖就可

2.2 隔离性

隔离性(Isolation):保证事务执行尽可能不受其他事务影响。InnoDB默认的隔离级别是可重复读

对于mysql来说,并行运行着许多事务,它们相互独立,互不干扰。那么它又是如何来实现的呢?大家一看牵扯到并行,那肯定就与锁有关,没错,mysql的隔离性实现方案的确和锁有关,但是对于mysql这样一种访问量超高的数据库而言,加锁无疑会会大大降低它的速率,其实为了解决这个问题,mysql还引进了mvcc(多版本并发控制)和锁一起来实现mysql的隔离性。

2.2.1 MVCC

什么是MVCC?

        MVCC即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

        MVCC在mysql Innodb中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读.解决了脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。

要想搞清楚MVCC,还需要搞清楚几个概念

当前读:

像select lock in share mode(共享锁),select for update;update,insert,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

快照读:

像不加锁的select就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于并发性能的考虑,快照读的实现是基于多版本的并发,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销,既然是基于多版本,快照读读取的并不一定是数据的最新版本,而有可能是之前的历史数据。

三者之间关系:

MVCC多版本并发控制是指维持一个数据的多个版本,使得读写操作没有冲突,快照读是mysql为实现MVCC的一个非阻塞功能。MVCC模块在mysql中的实现是由3个隐式字段undologredolog三个组件来实现的。        

2.2.2 undolog---MVCC

其实每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID

DB_TRX_ID : 6字节,最近修改事务的id, 创建这条记录或者最后一次修改该记录的事务id

DB_ROLL_PTR : 7字节,回滚指针,指向这条记录的上一个版本,用于配合undolog,指向上一个旧版本

DB_ROW_ID : 6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动生成一个6字节的row_id

画个图表示下: 

加入有一条事务编号为1的事务向表里面插入一条记录,那么此时此行数据的状态为:

之后进行一系列的修改:

undolog>>>>>回滚日志>>>>>记录的是数据的历史版本

 这样每次一对数据进行操作,undolog就会记录从而形成一个链表,链首是最新的记录,链尾是最旧的记录。但这个时候,undolog并不会无限制的增大,其会有一个purge线程清除没用的数据。

2.2.3 Read View---MVCC

        Read View是事务进行快照读操作的时候生产的读视图,在该事务执行快照读的那一刻,会生成一个数据系统当前的快照,记录并维护当前活跃事务的id,事务的id是递增的。

        其实Read View最大的作用是用来做可见性判断的,就是说当前事务在进行快照读的时候,对该记录创建一个 Read View视图,把它当做条件去判断当前事务能够看到那个版本的的数据,有可能读物到时最新的数据,也有可能读取到是当前行记录中某个历史版本的数据。

        Read View遵循的可见性算法主要是将要被修改的数据最新记录中的DB_TRX_ID(当前事务id)取出来,与系统中当前其他活跃事务的id做对比,如果DB_TRX_ID跟Read View的属性做了比较,不符合可见性,那么就通过DB_ROLL_PTR回滚指针去取出undolog中的DB_TRX_ID做比较,即遍历链表中的DB_TRX_ID,直到找到满足条件的DB_TRX_ID,这个DB_TRX_ID所在的旧记录就是当前事务能看到的最新老版本数据

Read View的可见性规则如下:

首先要知道Read View中的三个全局属性:

trx_list:   一个数值列表,用来维护Read View生成时刻系统正活跃的事务id (1,2,3)

up_limit_id:  记录trx_list列表中事务最小的id(1)

low_limit_id: Read View生成时刻系统尚未分配的下一个事务id(4)

具体比较规则如下:

1 首先比较DB_TRX_ID <  up_limit_id,如果小于,则当前事务能看到DB_TRX_ID所在的记录,如果大于等于进入下一个判断

2 接下来判断DB_TRX_ID >= low_limit_id,如果大于等于则代表DB_TRX_ID所在的记录在Read View生成后才出现的,那么对于当前事务肯定不可见,如果小于,则进入下一步判断。

3 判断DB_TRX_ID是否活跃在事务中,如果在,则代表在Read View生成时刻,这个事务还是活跃状态,还没有commit,修改的数据,当前事务也是看不到,如果不在 ,就说明这个事务在Read View生成之前已经开始commit,那么修改的结果是能够看见的。

既然有比较规则,那么就举个实例来验证下这个规则!

 问题: 事务2能否看见事务4修改并且已经提交的数据?

对于这个案例而言:trx_list = (1,2,3,4),up_limit_id = (1),low_limit_id = (5)

1 比较DB_TRX_ID(4) <  up_limit_id (1),显然不满足,进入下一轮比较;

2 比较DB_TRX_ID (4)>= low_limit_id(1)满足,进入下一轮

3 判断DB_TRX_ID(4)是否活跃在事务中,事务4已经提交了,所以不再活跃列表中,活跃列表是1,2,3,所以说明这个事务在快照生成之前就已经commit,所以可以看到。

RC,RR级别下的InnoDB快照读有什么不同 ?

因为Read View生成的时机不同,从而造成RC,RR级别下的快照读的结果不同。

1. 在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照读即Read View,将当前系统活跃的其他事务记录起来,此后在调用快照读的时候,还是使用同一个Read View,所以只要当前事务在其他事务提交之前更新过快照读,那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可见。

2. 在RR级别下,快照读生成Read View时,Read View会记录此时所有其他活动和事务的快照,这些事务的修改对于当前事务都是不可见的,而早于Read View创建的事务所做的修改均是可见。

3. 在RC级别下,事务中,每次快照读都会新生成一个快照和Read View,这就是我们在RC级别下 事务可以看到别的事务提交更新的原因

总结:在RC隔离级别下,是每个快照读都会生成并获取最新的Read View,而在RR级别下,则是同一个事务中的第一个快照才会创建Read View,之后的每一个快照读获取的都是同一个Read View。

2.3  持久性

持久性(Durability):保证事务提交后不会因为宕机等原因导致数据丢失。实现主要基于redolog。

        持久性这个特性相对于大家来说,可能在学习其他技术知识的时候,都有听说过这个词,由此可见持久性对于数据而言是多么重要。而mysql的持久性主要是通过redolog来实现的。

        假如我们在修改数据时,先将数据从磁盘读取到内存中,先在内存中将数据进行相应的修改(内存更新完成之后会变成脏页),然后将内存中的数据刷新进磁盘,假如这个过程中mysql挂掉了,那么这条数据就丢掉了,如何解决这个问题呢?redolog就出场了(redolog也是存在于磁盘里的一个日志文件)

        所以在数据写入磁盘之前,先向redolog日志中写一份,然后在向磁盘中对应的数据文件中写。这里可能大家就有问题,这样数据不就写两份了吗?这不是浪费时间吗?其实这其中牵扯到IO问题,当我们在进行读写操作时,有两种IO,一种随机IO,一种顺序IO.

随机IO: 当我们进行更改操作时,我们需要先找到这个条数,然后再进行修改,当数据量很大时,这会很浪费时间

顺序IO:直接将新增的数据进行追加操作,效率高。

        举个在网上看过的例子:当你在农村开了一家超市,大家都是乡里乡亲的,来买东西,有时候就会赊账,说到了月底一起算。大家都是街坊邻居的,也不好说什么,赊账就赊账吧。这个时候客流量不大的时候还好说,他说赊账,你就拿出你的小账本,一页一页的找他的名字,然后记上。但是当客流量很大时,根本来不及啊,这么多人等着呢!不让她赊账,改天就在村东头CBD说你坏话,怎么办呢,这个时候就可以搞块小黑板,先将她记下来,等到客人少了或者夜深人静的时候,你再将小黑板上的数据重新写到你的小账本上。

这个时候,这个小账本就相当于磁盘,小黑板就相当于redolog。

2.3.1 二阶段提交

        那这个时候又有问题了,mysql中这么多日志文件,redolog记录之后,binlog还会记录吗?

答案:会  ,那么它们的顺序是什么呢?

注意:这是一个面试题:什么是二阶段提交?

mysql数据更新流程:

1 执行器先从引擎中找到数据,如果在内存中直接返回,如果不在内存中,查询后返回

2.执行器拿到数据之后会先修改数据,然后调用引擎接口重新写入数据

3.引擎将数据更新到内存,同时写数据到redolog,此时处于prepare阶段,并通过执行器执行完成,随时可以操作

4.执行器生成这个操作的binlog

5。执行器调用引擎的事务提交接口,引擎将刚刚写完成的redo改成commit状态,更新完成。

链路

只有这样,才能够防止先写redolog后,由于断电的一些操作,binlog没有同步数据,导致数据的不一致。那这样就有人会问,那我先记录binlog,让它处于prepare状态,再写入redolog。这样是不是也行呢?其实这样是不行的,因为binlog没有prepare状态

2.4 一致性

一致性(Consistency):事务追求的最终目标,一致性的实现即需要数据库层面的保障,也要应用层面的保障。

一致性的实现其实是由另外三个特性共同来保证的

http://www.wooajung.com/news/34477.html

相关文章:

  • 网站无法收录天津seo排名扣费
  • 个人网站域名怎么起seo平台优化
  • 关于做芯片类招聘的网站软文写作平台
  • 网站制作 电子商城seo教程 seo之家
  • 邵东做网站的公司太原seo关键词排名优化
  • 深圳龙岗做网站公司哪家好关键词云图
  • 网站上传图片问题网络公关公司联系方式
  • 网站专题制作原则佣金高的推广平台
  • 网上做批发有哪些网站靠谱网站如何进行优化
  • 宜州设计公司百度网盘seo优化
  • 旅游网站 功能外链推广网站
  • 织梦后台怎么换网站模板百度竞价排名案例分析
  • 服务网络是什么意思天津seo优化
  • 使用webp的网站电脑优化软件推荐
  • 网站建设发好处广州新闻报道
  • 太平保险网站搜索引擎优化的作用
  • 网站建设是前端的吗郑州网络seo
  • 企业网站的开发背景武汉seo外包平台
  • 深圳装饰网站建设百度电脑版网址
  • 排版网站推荐如何发布自己的html网站
  • 又拍网站怎么做的国外引流推广软件
  • wordpress 图片等比例缩放如何做优化排名
  • 网站域名dns企业网络推广方法
  • 做app网站需要什么条件职业技能培训网上平台
  • 上海专业网站建设费百度搜索推广方案
  • 做网站对企业有什么好处全部列表支持安卓浏览器软件下载
  • 商洛市城乡建设局网站软文撰写公司
  • bootstrap网页模板源码seo快速排名上首页
  • behance设计网站 教程上海推广服务
  • 房地产网站广告销售怎么做推介网