帮忙么网 > Spring > 当前页面

MySQL MVCC了解吗?

2024-10-24 NEW个对象

MVCC就是多版本并发控制,主要解决事务读写数据的1并发问题。

数据库并发场景有三种,分别为:

读-读:不存在任何问题,也不需要并发控制
读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读
写-写:有线程安全问题,可能会存在更新丢失问题

在数据库读读操作是没问题的,写写操作通过加锁的方式解决,读写操作通过mvcc来解决的。

读写操作能不能通过加锁方式解决呢,当然是可以的,但是性能太差,追求极致的技术大牛肯定是不允许的。

MVCC的实现原理是基于:当前读和快照读、undo log版本链、read view。

在RC(读已提交)和RR(可重复度)级别下,MVCC都会生效,那么为什么RC不可以解决幻读,而RR可以解决幻读?

原因: 两种隔离级别下的核心处理逻辑就是判断所有版本中哪个版本是当前事务可见的处理。针对这个问题InnoDB在设计上增加了ReadView的设计,ReadView中主要包含当前系统中还有哪些活跃的读写事务,把它们的事务id放到一个列表中,我们把这个列表命名为为m_ids。

以上内容是对于 RR 级别来说,而对于 RC 级别,其实整个过程几乎一样,唯一不同的是生成 ReadView 的时机,RR 级别只在事务开始时生成一次,之后一直使用该 ReadView。而 RC 级别则在每次 select 时,都会生成一个 ReadView。

相关文章

  • Spring security的执行流程

    Spring Security 的执行流程: 1、认证(Authentication):先经过认证过滤器 -> 认证管理器 -> 成功后存入 SecurityContextHolder 2、授权(Authorization):访问资源时经过授权过滤器 -> 权限判断 -> 允许访问或拒绝访问 3、所有请求都经过 SecurityFilterChain 过滤

    NEW个对象 2025-02-27

  • Spring如何通过三级缓存解决循环依赖问题

    三级缓存: 一级缓存(singletonObjects):存储已经完全初始化的单例 Bean 对象。 二级缓存(earlySingletonObjects):存储已经实例化但尚未完全初始化的单例 Bean 对象。 三级缓存(singletonFactories):存储 Bean 对象的创建工厂,用于在创建过程中检测循环依赖。

    NEW个对象 2024-12-17

  • 深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念?

    https://blog.csdn.net/belongtocode/article/details/141299958

    NEW个对象 2025-01-12