您的位置:首页 > 文旅 > 旅游 > 电子商务网站模板_苏州seo排名优化_品牌推广策略包括哪些内容_无屏蔽搜索引擎

电子商务网站模板_苏州seo排名优化_品牌推广策略包括哪些内容_无屏蔽搜索引擎

2024/12/28 12:11:22 来源:https://blog.csdn.net/tangjieqing/article/details/144264874  浏览:    关键词:电子商务网站模板_苏州seo排名优化_品牌推广策略包括哪些内容_无屏蔽搜索引擎
电子商务网站模板_苏州seo排名优化_品牌推广策略包括哪些内容_无屏蔽搜索引擎

MVCC介绍

mvcc是mysql为了解决脏读不可重复读等事务之间读写问题而诞生的;它替代了一些场景下的低效锁,在保证隔离性的基础上,提升了读取效率和并发性。

MVCC实现

在mysql中mvcc是基于mysql的undo log和readview来实现的。

undo log

在innodb中,每一条sql通过执行器后,就会在回滚段undolog segment中申请一个undo log页,根据sql信息来构建对应的undo log内容,同时将其写入磁盘,以保证每次操作真正数据之前undo log是完整的,之后才会执行数据写入记录redo log等。

undo log格式

上图可以看到,每条undo log日志中会包含旧roll_pointer,这样就方便mysql查询到之前的历史数据记录,而想知道mysql如何应用好这些版本记录,还需要了解一下innodb引擎数据行的格式,在innodb引擎中默认的格式为DYNAMIC,它的结构如下:

可以看到在每一行中都有一个字段来记录回滚指针,而该回滚指针就会指向undo log,如下图:

这样通过roll_pointer关联,就把undo log组成一个链了,回滚时只需要依次撤销即可。

read view

在进行数据查询时,mysql会构造一个read view,它会记录该数据版本链的一些统计值例:
1.m_ids:当前活跃的事务集合(还未提交的事务)
2.min_trx_id:集合中最小事务编号(版本链结尾的事务id)
3.max_trx_id:集合中最大事务编号 + 1
4.creator_trx_id:创建当前视图的事务编号

构建完read view后根据以下规则查询即可:

image.png

  1. 判断当前版本数据是否为当前事务创建(creator_trx_id = trx_id),意味着读取自己修改的数据,是可以直接访问的;

  2. 如果当前版本数据的事务编号小于最小活跃事务(min_trx_id > trx_id),意味着该版本已经提交可以直接访问;

  3. 如果当前版本数据大于最大事务编号,则意味着创建该版本数据时还有生成该事务,需要遍历undo log,直到版本数据小于max_trx_id或者trx_id为空没有数据为止;

  4. 当前版本数据的事务编号在min_trx_id和max_trx_id之间,同时不在活跃事务列表中,意味着创建事务时该版本数据已经提交可以查询到,如果不是则继续遍历undo log.

通过以上规则进行查询,就可以实现查询到的都是已经提交事务的数据,解决了脏读问题。在事务第一个查询时创建一个Read View,后续查询都用这个Read View进行判断,这样每次查询结果都是一样的,这样就解决了不可重复读问题;在可重复读的隔离级别下就采用这种方式来解决不可重复读问题;如果事务每次查询都创建一个Read View,这样就会有不可重复读问题,在读已提交的事务隔离级别下就是这种实现方法。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com