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

 更新时间:2019年10月09日 12:02:24   作者:fandsimple  
这篇文章主要介绍了mysql多版本并发控制MVCC的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

事务隔离级别设置

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;

脏读、不可重复读、幻读

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MySQL数值类型溢出的处理方法

    MySQL数值类型溢出的处理方法

    这篇文章主要给大家介绍了关于MySQL数值类型溢出的处理方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • mysql双向加密解密方式用法详解

    mysql双向加密解密方式用法详解

    这篇文章主要介绍了mysql双向加密解密方式用法,需要的朋友可以参考下
    2014-04-04
  • 浅析MySQL之字符串函数

    浅析MySQL之字符串函数

    这篇文章介绍了MySQL字符串函数,有需要的朋友可以参考一下
    2013-10-10
  • MySQL skip-character-set-client-handshake导致的一个字符集问题

    MySQL skip-character-set-client-handshake导致的一个字符集问题

    这篇文章主要介绍了MySQL skip-character-set-client-handshake导致的一个字符集问题,需要的朋友可以参考下
    2014-07-07
  • Mysql中tinyint(1)和tinyint(4)的区别详析

    Mysql中tinyint(1)和tinyint(4)的区别详析

    这篇文章主要给大家介绍了关于Mysql中tinyint(1)和tinyint(4)区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • mysql主键,外键,非空,唯一,默认约束及创建表的方法

    mysql主键,外键,非空,唯一,默认约束及创建表的方法

    这篇文章主要介绍了mysql主键,外键,非空,唯一,默认约束及创建表的方法,在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位
    2022-07-07
  • 浅析CentOS6.8安装MySQL8.0.18的教程(RPM方式)

    浅析CentOS6.8安装MySQL8.0.18的教程(RPM方式)

    这篇文章主要介绍了CentOS6.8安装MySQL8.0.18(RPM方式)的详细教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • MySQL设置管理员密码无法生效的问题解析

    MySQL设置管理员密码无法生效的问题解析

    这篇文章主要介绍了MySQL设置管理员密码无法生效的问题解析,一般在遇到 MySQL 问题时,建议对 MySQL 系统函数、数据库内部对象等进行检索而不是直接打印字符串,有时候可能对快速定位问题原因有帮助,需要的朋友可以参考下
    2022-06-06
  • MySQL中如何正确存储IP地址

    MySQL中如何正确存储IP地址

    在MySQL中,当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串,下面就来详细的介绍一下具体原因,感兴趣的可以了解一下
    2023-05-05
  • Centos下安装多个mysql数据库的配置实例详解

    Centos下安装多个mysql数据库的配置实例详解

    在实际的开发和运维场景中,有时我们需要在同一台服务器上运行多个MySQL数据库实例,本文将详细介绍如何在CentOS系统中安装并配置多个MySQL数据库实例,希望对大家有所帮助
    2025-04-04

最新评论