mysql多版本并发控制MVCC的实现

作者:fandsimple 时间:2024-01-23 21:49:28 

事务隔离级别设置


set global transaction isolation level read committed; //全局的
set session transaction isolation level read committed; //当前会话

修改事务提交方式(是否自动提交,mysql默认自动提交)


SET AUTOCOMMIT = 1; //自动提交,为0手动提交

不同数据库引擎MVCC模式各不相同,典型有乐观和悲观并发控制。

innodb

说明:

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number).每开始个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的

SELECT

InnoDB会根据以下两个条件检查每行记录:

a. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插人或者修改过的。

b.行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。

只有符合上述两个条件的记录,才能返回作为查询结果。

INSERT

InnoDB为新插人的每行 保存当前系统版本号作为行版本号。

DELETE

InnoDB为删除的每行保存当前系统版本号作为行删除标识。

UPDATE

InnoDB为插人行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。

注意:

MVCC只在REPEATABLE READ 和READ COMMITED 两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容法,因为READ UNCOMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁。

查看当表的状态


show table status like 'task'\G;

脏读、不可重复读、幻读

脏读:当前事务读到了另一个事务未提交的状态,事务没有实现隔离。

不可重复读:实现了事务的隔离性,但两次读取同一条数据的时候发现数据不一致了。

幻读:两次查询同一批数据,发现有新数据 * 入,主要是因为中途有其他事务对数据集进行了插入操作。(加了间隙锁解决该问题)

来源:https://juejin.im/post/5d98be226fb9a04e247c864d

标签:mysql,多版本,并发控制,MVCC
0
投稿

猜你喜欢

  • Python如何生成随机高斯模糊图片详解

    2021-08-25 13:07:18
  • vue iview实现动态新增和删除

    2024-05-08 09:34:31
  • python四则运算表达式求值示例详解

    2023-01-31 06:03:04
  • Jaspersoft Studio添加mysql数据库配置步骤

    2024-01-17 01:13:26
  • 多个函数验证同一表单方法

    2007-10-06 22:55:00
  • ChatGPT 中文调教指南总结

    2022-12-23 03:44:10
  • python fabric实现远程操作和部署示例

    2021-07-18 14:22:14
  • Python Timer和TimerFPS计时工具类

    2022-06-13 12:48:38
  • Django filter动态过滤与排序实现过程解析

    2022-01-07 18:16:54
  • 一些常用的Python爬虫技巧汇总

    2021-01-02 22:51:56
  • 基于Python实现自动化生成数据报表

    2021-11-07 00:42:16
  • Go 值传递与引用传递的方法

    2023-06-25 03:11:11
  • python numpy库中数组遍历的方法

    2021-03-20 16:57:28
  • 微信小程序基于slider组件动态修改标签透明度的方法示例

    2024-05-11 09:42:14
  • python使用append合并两个数组的方法

    2022-08-07 08:25:05
  • 页面制作中要注意的编码问题

    2008-08-11 12:43:00
  • JS如何生成一个不重复的ID的函数

    2024-04-17 09:48:51
  • 用生成器来改写直接返回列表的函数方法

    2022-04-24 15:36:08
  • python定间隔取点(np.linspace)的实现

    2022-05-01 12:30:25
  • 国内常用的js类库大全(CDN公共库)

    2024-05-11 10:23:29
  • asp之家 网络编程 m.aspxhome.com