MySQL MVCC了解吗?
2024-10-24
NEW个对象
MVCC就是多版本并发控制,主要解决事务读写数据的1并发问题。
数据库并发场景有三种,分别为:
读-读:不存在任何问题,也不需要并发控制
读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读
写-写:有线程安全问题,可能会存在更新丢失问题
在数据库读读操作是没问题的,写写操作通过加锁的方式解决,读写操作通过mvcc来解决的。
读写操作能不能通过加锁方式解决呢,当然是可以的,但是性能太差,追求极致的技术大牛肯定是不允许的。
MVCC的实现原理是基于:当前读和快照读、undo log版本链、read view。
MVCC主要解决RR和RC问题。
在RC(读已提交)和RR(可重复度)级别下,MVCC都会生效,那么为什么RC不可以解决幻读,而RR可以解决幻读?
原因: 两种隔离级别下的核心处理逻辑就是判断所有版本中哪个版本是当前事务可见的处理。针对这个问题InnoDB在设计上增加了ReadView的设计,ReadView中主要包含当前系统中还有哪些活跃的读写事务,把它们的事务id放到一个列表中,我们把这个列表命名为为m_ids。
以上内容是对于 RR 级别来说,而对于 RC 级别,其实整个过程几乎一样,唯一不同的是生成 ReadView 的时机,RR 级别只在事务开始时生成一次,之后一直使用该 ReadView。而 RC 级别则在每次 select 时,都会生成一个 ReadView。
上一篇:kafka消费者组是什么?
相关文章
-
cglib与jdk代理的区别
JDK 动态代理: 只支持接口代理。它通过反射机制生成一个实现了指定接口的代理类。 代理对象只能调用接口中定义的方法。 CGLib 动态代理: 通过继承方式生成代理类。它可以代理没有实现接口的类。 代理对象可以调用类中的所有方法(除了final方法)。
NEW个对象 2025-01-18
-
Spring 提供了哪些接口让用户自定义?详解 Spring 扩展点
Spring 提供了哪些接口让用户自定义?详解 Spring 扩展点
NEW个对象 2026-06-18
-
微服务定位问题
SkyWalking定位慢点,然后EKL分析日志
NEW个对象 2026-06-30
NEW个对象
JAVA是世界上最好的语言