前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mvcc--mysql详解(十一)

Mvcc--mysql详解(十一)

作者头像
用户9919783
发布2022-12-14 17:55:16
1990
发布2022-12-14 17:55:16
举报

上篇文章说了为了解决mysql原子性,于是undo日志来记录需要回滚的数据,首先回滚不需要考虑select,每行数据都有roll_pointer指针,指向insert undo日志,update和delete与insert是不同的,多一个old_roll_pointer指向需要回滚的日志,update分为主键更新和非主键更新,减少不必要的重排序性能消耗。

Undo日志--mysql详解(十)

Mvcc

全称是multi-version concurrency control,多版本并发控制。

当我们并发执行会发生什么问题呢?

脏读:当一个事务读取了另一个事务里未提交的数据,甚至在另一个事务发生了回滚,这个数据并不存在。

不可重复读:在一个事务里,每次读取都是其他事务最新值,而导致在每次查询的值每次都不一致。

幻读:在一个事务里,每次查询的记录数不一样,有的时候多,有的时候少,针对于新增和删除。(一个事务先查询一些数据,另一个事务又向表里插入新数据,这时候在第一个事务查询的值增多)

四种隔离级别:

Read uncommit:存在以上三个问题。

Read commit:解决脏读。

Repeatable read:解决不可重复读,每次select都是不同的数据,被其他事务所修改。

Serializable:串行化,各种问题都不会发生,效率低。

隔离级别可以通过set transaction isolation level serializable,查看可以用show

Variables like ‘transaction_isolation’;

对于serializable隔离级别的事务,采用的是加锁方式解决的,对于read uncommit、commit、

Repeatable read级别采用的是readView。

M_ids:表示系统中活跃的读写事务id列表。

Min_trx_id:表示活跃中的最小事务id。(m_ids里最小值)

max_trx_id:表示应该分配给下一个事务的id。(不在m_ids里)

Creator_trx_id:表示生成该readView的事务id。

他的过程就是当前事务会与这些字段来判断:

当当前事务小于最小事务id的时候,代表已经被提交,可以被访问。

当当前事务大于最大事务id的时候,表示事务在之后才开启,不可以被访问。

如果在之间,则判断是都在m_ids活跃列表里,在的话不可以访问,不在则可以访问。

Read commit和repeatable不同的是,readview生成时机不同,前者是每次select都会生成readView,后者只有第一次select会生成,后面重复使用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档