湖南建设厅网站不良记录,简述网站开发的工作流程,十大装潢公司上海,建筑工程起名吉祥大气文章目录 前言RR 隔离级别MVCCRR MVCC 有幻读问题吗#xff1f;幻读问题演示如何彻底解决幻读#xff1f;小结 前言
幻读是 MySQL 中一个非常普遍#xff0c;且面试中经常被问到的问题#xff0c;如果你还搞不懂什么是幻读#xff1f;什么是 MVCC#xff1f;以及 MySQL… 文章目录 前言RR 隔离级别MVCCRR MVCC 有幻读问题吗幻读问题演示如何彻底解决幻读小结 前言
幻读是 MySQL 中一个非常普遍且面试中经常被问到的问题如果你还搞不懂什么是幻读什么是 MVCC以及 MySQL 中的锁那么请好好收藏和阅读本篇文章因为它非常重要。
RR 隔离级别
在 MySQL 中RR 代表 Repeatable Read可重复读是数据库事务隔离级别中的一种它的特性是保证同一个事务中多次读取同一条记录时读取到的数据都是一致的。它也是 MySQL 默认的事务隔离级别。 隔离级别是数据库管理系统为了处理并发访问时控制事务之间相互影响的程度而定义的一组规则。 MVCC
MVCCMulti-Version Concurrency Control多版本并发控制是一种并发控制机制用于在数据库系统中处理并发读写操作时保持数据的一致性和隔离性主要是用来解决幻读问题的。MVCC 通过在每个数据行上保存多个版本的数据来实现并发读取和写入的一致性。
MVCC 的核心思想是将每个事务的读操作与写操作解耦通过保存数据的历史版本来实现并发控制。每个事务在开始时会创建一个读视图Read View用于确定在事务开始时可见的数据版本。读视图包含一个事务开始时的系统版本号用于与数据行的版本号进行比较以确定数据行是否对事务可见。
在 MVCC 中当一个事务执行写操作时会生成一个新的数据版本并将旧版本的数据保存在回滚日志Undo Log中。这样其他事务在读取数据时仍然可以访问到旧版本的数据从而避免了幻读问题。
MVCC 工作流程如下 读操作当一个事务执行 SELECT 语句时会根据读视图的系统版本号和数据行的版本号进行比较只读取在事务开始之前已经提交的数据行。这样即使其他事务正在并发地插入或删除数据事务仍然可以读取到一致的数据。 写操作当一个事务执行 INSERT、UPDATE 或 DELETE 语句时会生成新的数据版本并将旧版本的数据保存在回滚日志中。这样其他事务在读取数据时仍然可以访问到旧版本的数据从而避免了幻读问题。
MVCC 机制在数据库系统中广泛应用特别是在支持事务的存储引擎中如 MySQL 的 InnoDB 引擎。它通过解耦读操作和写操作提供了高并发性能和数据一致性使得多个事务可以同时读取和修改数据库而不会相互干扰。
RR MVCC 有幻读问题吗
在 MySQL 中即使是RR 隔离级别可重复读虽然它通过 MVCC 消除了绝大部分幻读问题但依旧存在部分幻读问题所以 RR 隔离级别存在幻读问题而 MVCC 也没有彻底解决幻读问题。
幻读问题演示
在 RR 隔离级别中存在两种读操作
快照读数据库中一种读取数据的方式它基于事务开始时的一个一致性快照来读取数据。快照读可以提供事务开始时的数据视图即使在事务执行期间其他事务对数据进行了修改也不会影响快照读取到的数据。简单理解快照读就是事务开启时创建一个缓存之后的查询都会从这个缓存中获取数据。当前读数据库中一种读取数据的方式它读取最新提交的数据而不是基于事务开始时的一致性快照。
所以在 RR 隔离级别中 MVCC 通过快照读的方式解决了大部分幻读问题但如果 RR 隔离级别存在当前读使用 select … for update 实现那么此时也会发生幻读问题比如以下执行过程 如何彻底解决幻读
想要彻底解决幻读问题有两个方案
使用串行化Serializable隔离级别官方推荐方案但这种解决方案并发性能比较低。RR 锁使用 RR 隔离级别但在事务开启之后立即加锁如下图所示
事务一开启之后就加锁之后其他事务在操作此表的相关数据时就只能等待锁释放事务一提交或回滚锁自动释放。
小结
在可重复读级别中MySQL 虽然使用 MVCC 解决了大部分幻读问题但在当前读的操作中依然有幻读问题此时可以通过加锁或升级隔离级别为串行化来解决幻读问题。