MVCC原理介绍
1. MVCC的核心思想
2. 版本链
-
数据值:该版本的数据内容。
-
版本号:创建该版本的事务ID(Transaction ID)。
-
回滚指针:指向该版本的上一个版本,用于回滚操作。
当前版本 -> 前一个版本 -> 再前一个版本 -> ...
3. 隐藏字段
-
事务ID(Transaction ID):标识创建该版本的事务。
-
回滚指针(Rollback Pointer):指向该版本的上一个版本。
-
删除标记(Delete Marker):标记该版本是否被删除。
4. 快照读与当前读
-
快照读(Snapshot Read):
-
快照读是基于事务开始时的数据库快照进行读取,不加锁。
-
数据库通过版本链和事务版本号,找到符合当前事务快照的数据版本。
-
快照读适用于读已提交(Read Committed)和可重复读(Repeatable Read)隔离级别。
-
-
当前读(Current Read):
-
当前读直接读取数据的最新版本,可能会加锁。
-
当前读用于确保读取到最新的数据版本,适用于串行化(Serializable)隔离级别。
-
例如,
SELECT ... FOR UPDATE
操作会触发当前读。
-
5. Read View
-
事务创建时的系统版本号(m_ids):标识事务开始时的数据库状态。
-
活跃事务列表(min_trx_id, max_trx_id):记录当前正在运行的事务ID范围。
-
已提交事务列表(up_limit_id, low_limit_id):记录已提交事务的版本号范围。
-
如果版本号小于
min_trx_id
,说明该版本在事务开始之前已经提交,可见。 -
如果版本号在
min_trx_id
和max_trx_id
之间,且不在活跃事务列表中,可见。 -
如果版本号大于
max_trx_id
,说明该版本在事务开始之后创建,不可见。
6. 版本链的创建与更新
-
更新操作:
-
创建一个新的版本,记录新的数据值和当前事务ID。
-
新版本的回滚指针指向旧版本。
-
旧版本的删除标记被设置为
true
,表示该版本已被覆盖。
-
-
删除操作:
-
创建一个新的版本,标记为删除(
delete_marker = true
)。 -
新版本的回滚指针指向旧版本。
-
旧版本仍然保留,用于回滚操作。
-
7. 垃圾回收
-
垃圾回收会清理那些不再被任何事务需要的旧版本数据。
-
数据库通过检查版本链和活跃事务列表,判断哪些版本可以被删除。
8. MVCC与事务隔离级别
-
读已提交(Read Committed):
-
每次查询都创建一个新的Read View。
-
只读取已提交的数据版本,避免脏读。
-
-
可重复读(Repeatable Read):
-
事务开始时创建一个Read View,并在事务生命周期内始终使用该Read View。
-
避免不可重复读和幻读。
-
-
串行化(Serializable):
-
通过强制事务串行执行,完全避免并发问题。
-
通常不使用MVCC,而是通过锁机制实现。
-
9. MVCC的优势
-
提高并发性能:读操作不加锁,避免了读写冲突,提高了系统的并发性能。
-
支持高级隔离级别:通过版本控制,实现了读已提交和可重复读隔离级别。
-
减少锁竞争:减少了锁的使用,降低了锁竞争带来的开销。
10. MVCC的局限性
-
空间开销:需要存储多个版本的数据,增加了存储空间的占用。
-
复杂性:实现MVCC机制需要复杂的逻辑,增加了数据库系统的复杂性。
-
垃圾回收问题:旧版本数据的清理需要合理设计垃圾回收机制,否则可能导致性能问题。
总结
日历
个人资料

diaba 寻求合作请留言或联系mail: services@jiucaiyuan.net
链接
最新文章
存档
- 2025年3月(18)
- 2025年2月(20)
- 2025年1月(2)
- 2024年10月(1)
- 2024年8月(2)
- 2024年6月(4)
- 2024年5月(1)
- 2023年7月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(11)
- 2022年5月(6)
- 2022年4月(33)
- 2022年3月(26)
- 2021年3月(1)
- 2020年9月(2)
- 2018年8月(1)
- 2018年3月(1)
- 2017年3月(3)
- 2017年2月(6)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(1)
- 2016年9月(3)
- 2016年8月(4)
- 2016年7月(3)
- 2016年6月(4)
- 2016年5月(7)
- 2016年4月(9)
- 2016年3月(4)
- 2016年2月(5)
- 2016年1月(17)
- 2015年12月(15)
- 2015年11月(12)
- 2015年10月(6)
- 2015年9月(11)
- 2015年8月(8)
分类
热门文章
- SpringMVC:Null ModelAndView returned to DispatcherServlet with name 'applicationContext': assuming HandlerAdapter completed request handling
- Mac-删除卸载GlobalProtect
- java.lang.SecurityException: JCE cannot authenticate the provider BC
- MyBatis-Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Idea之支持lombok编译
标签
最新评论
- logisqykyk
Javassist分析、编辑和创建jav... - xxedgtb
Redis—常见参数配置 - 韭菜园 ... - wdgpjxydo
SpringMVC:Null Model... - rllzzwocp
Mysql存储引擎MyISAM和Inno... - dpkgmbfjh
SpringMVC:Null Model... - tzklbzpj
SpringMVC:Null Model... - bqwrhszmo
MyBatis-Improper inl... - 乐谱吧
good非常好 - diaba
@diaba:应该说是“时间的度量依据”... - diaba
如果速度增加接近光速、等于光速、甚至大于...
最新微语
- 在每件事情上花费的东西,就是生命的一部分,而我们花费的这些东西要求立即得到回报,或者在一个长时间以后得到回报。
2025-01-23 15:46
- 诺曼·文森特说:“并不是你认为自己是什么样的人,你就是什么样的人。但是你的思想是什么样,你就是什么样的人。”
2025-01-23 15:44
- 从今天起,做一个幸福的人。喂马,砍柴,(思想)周游世界
2022-03-21 23:31
- 2022.03.02 23:37:59
2022-03-02 23:38
- 几近崩溃后,找到解决方法,总是那么豁然开朗!所以遇到问题要坚持!
2018-07-18 10:49
发表评论: