通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

既然MySQL中InnoDB使用MVCC,为什么REPEATABLE-READ不能消除幻读

REPEATABLE-READ不能消除幻读的原因:因为现象为幻读的并发问题是因为这些问题的影响范围超出了行级别,REPEATABLE-READ只能保证行级别的隔离性,但无法处理更高级别的隔离性问题。

一、REPEATABLE-READ不能消除幻读的原因

务隔离级别关注的是读操作的数据是否会受到其他并发事务的影响。在 REPEATABLE READ 隔离级别下,InnoDB 采用的是多版本并发控制(MVCC)来实现隔离性。通过MVCC,InnoDB将每一行数据版本化,每个事务读取的是它启动时的行版本快照,并不受其他事务的影响。因此,REPEATABLE READ 隔离级别能够避免脏读、不可重复读等问题。

然而,现象为幻读的并发问题则是因为这些问题的影响范围超出了行级别,MVCC 只能保证行级别的隔离性,但无法处理更高级别的隔离性问题。幻读问题的典型例子是:一个事务在读取某个表中的记录时,另外一个事务在此时向表中新增了一个记录,名列前茅个事务再次查询时,会出现名列前茅次查询和第二次查询结果不一致的现象,这就是幻读。

总之,REPEATABLE-READ 隔离级别采用了 MVCC 技术,可以有效地解决脏读、不可重复读等级别的隔离性问题,但不能消除幻读问题。

二、幻读

幻读(Phantom Read),是指当事务不是独立执行时发生的一种现象。事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。幻读是指当事务不是独立执行时发生的一种现象,例如名列前茅个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作名列前茅个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。

在数据库定义的四种隔离级别中,较高隔离级别SERIALIZABLE_READ可以保证不出现幻读的问题。针对当前读,RR隔离级别保证对读取到的记录加锁(记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入(间隙锁),不存在幻读现象。

三、mysql介绍

1、简介

MySQL是一个关系型数据库管理系统由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是较好的 RDBMS(Relational Database Management System,关系数据库管理系统)应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

2、索引功能

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引不是使用广泛的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程度上弥补这一缺陷,许多 SQL 命令都有一个 DELAY_KEY_WRITE 项。这个选项的作用是暂时制止 MySQL 在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE 选项的作用将非常明显。另外,索引还会在硬盘上占用相当大的空间。因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但 MySQL 把同一个数据表里的索引总数限制为16个。

与 InnoDB数据表相比,在 InnoDB 数据表上,索引对 InnoDB 数据表的重要性要大得多。在 InnoDB 数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的基础。“数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。这种锁定将影响到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE 命令以及 INSERT、UPDATE 和 DELETE 命令。出于效率方面的考虑,InnoDB 数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。

3、MySQL 中文排序错误的解决方法

在 MySQL 数据库中,进行中文排序和查找的时候,对汉字的排序和查找结果是错误的。这种情况在 MySQL 的很多版本中都存在。如果这个问题不解决,那么 MySQL 将无法实际处理中文。出现这个问题的原因是:MySQL 在查询字符串时是大小写不敏感的,在编绎 MySQL 时一般以 ISO-8859 字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象,一种解决方法是对于包含中文的字段加上“binary”属性,使之作为二进制比较,例如将“name char(10)”改成“name char(10)binary”。

如果你使用源码编译 MySQL,可以编译 MySQL 时使用 –with–charset=gbk 参数,这样 MySQL 就会直接支持中文查找和排序了。

4、新特性

  • 表和索引的分区
  • 行级复制
  • MySQL 基群基于磁盘的数据支持
  • MySQL 集群复制
  • 增强的全文本搜索函数
  • 增强的信息模式(数据字典)
  • 可插入的 API
  • 服务器日志表
  • XML(标准通用标记语言的子集)/ XPath支持
  • 实例管理器
  • 表空间备份
  • mysql_upgrade 升级程序
  • 内部任务/事件调度器
  • 新的性能工具和选项如 mysqlslap

延伸阅读1:mysql授权协议

MySQL 遵守的不只是 GPL 协议,而是双授权模式(dual license)即你在遵守 GPL 协议的开源项目使用 MySQL,需要遵守 GPL 协议方能使用。如果你在非开源项目使用(即软件不打算开放源代码),且该软件用来销售,则需要向 MySQL 支付相应 license 费用。

相关文章