9

[吾爱]Django4+Vue3全新技术实战全栈项目 庭前雪压松桂丛

 1 year ago
source link: https://studygolang.com/articles/36249
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

[吾爱]Django4+Vue3全新技术实战全栈项目

download:Django4+Vue3全新技术实战全栈项目

RR有幻读问题吗?MVCC能否处理幻读?

幻读是 MySQL 中一个十分普遍,且面试中经常被问到的问题,假如你还搞不懂什么是幻读?什么是 MVCC?以及 MySQL 中的锁?那么请好好珍藏和阅读本篇文章,由于它十分重要。

RR 隔离级别 在 MySQL 中,RR 代表 Repeatable Read(可反复读),是数据库事务隔离级别中的一种,它的特性是保证同一个事务中,屡次读取同一条记载时,读取到的数据都是分歧的。它也是 MySQL 默许的事务隔离级别。

隔离级别是数据库管理系统为了处置并发访问时,控制事务之间互相影响的水平而定义的一组规则。 MVCC MVCC(Multi-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 处理了大局部幻读问题,但在当前读的操作中仍然有幻读问题,此时能够经过加锁,或晋级隔离级别为串行化来处理幻读问题。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK