暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL读提交与可重复读有什么区别?

还我至尊 2024-08-30
231

在数据库并发控制中,隔离级别对应了不同的数据一致性要求和性能特点。MySQL 中的两个常见隔离级别是读提交(READ COMMITTED)和可重复读(REPEATABLE READ)。本文将从隔离级别、实现方式、锁定策略、并发性能和幻读问题等方面对比这两者的差异。

  1. 隔离级别

读提交:在此隔离级别下,一个事务只能看到其他事务已提交的更改。这意味着,同一个事务中的多次查询可能会看到不同的数据,因为其他事务在此期间可能已经提交了更改。

可重复读:在此隔离级别下,一个事务启动时看到的数据是一致的。即使其他事务提交了更改,这些更改对当前事务也不可见,确保事务内的多次查询结果一致。

  1. 实现方式

MySQL 使用 InnoDB 存储引擎实现这两种隔离级别。这些实现依赖于多版本并发控制(MVCC)技术,即为每个事务提供一个数据的一致性快照。

读提交:InnoDB 为每次查询创建一个新的数据快照,该快照包含了在查询开始之前已提交的所有事务所做的更改。

可重复读:InnoDB 为整个事务创建一个数据快照,该快照在事务开始时创建,并在事务执行过程中保持不变。因此,事务内的所有查询都是基于同一快照的。

  1. 锁定策略

读提交:InnoDB 仅在需要修改数据时使用行锁(row lock)对数据进行锁定。对于读操作,不会加锁。

可重复读:InnoDB 在读操作中使用一种称为 Next-Key Locking 的锁定策略。这种策略结合了行锁和间隙锁(gap lock),锁定被查询到的行以及这些行之间的间隙。这有助于避免幻读问题。

  1. 并发性能

读提交:由于仅在修改数据时加锁,读操作不受影响,因此并发性能较好。这使得读提交成为许多 OLTP(在线事务处理)系统的首选隔离级别。

可重复读:由于在读操作中使用了 Next-Key Locking,可能会导致锁的竞争,从而降低并发性能。然而,可重复读可以在一定程度上解决幻读问题。

  1. 幻读问题

读提交:由于仅在修改数据时加锁,读提交隔离级别并不能解决幻读问题。

可重复读:由于使用了 Next-Key Locking 策略,可重复读隔离级别可以在一定程度上解决幻读问题。但在某些情况下(如查询使用非唯一索引的列时),仍然可能出现幻读。

image.png

参考网址:
https://baijiahao.baidu.com/s?id=1764251146217248529&wfr=spider&for=pc

最后修改时间:2024-08-30 14:14:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论