赞
踩
在学习小林coding---MySQL篇中,MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种:
此学习章节总结整理"当前读和快照读"相关知识如下:
1、mysql读取数据实际上有两种读取模式:当前读和快照读
2、相关知识
回滚日志undo log:在操作数据之前,把需要操作的数据和事务记录备份到undo log中,目的就是为了保证原子性,如果一个事务执行中发生了故障,就可以通过undo log进行回滚。
共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
MVCC:全称Multi-Version Concurrency Control(感兴趣的小伙伴可以参考学习这个全网最全的一篇数据库MVCC详解,不全我负责-mysql教程-PHP中文网)
3、当前读
当前读读取的是记录的最新版本(最新数据,而不是历史版本的数据),读取时还要保证其他并发事务 不能修改当前记录,会对读取的记录进行加锁。
基于上述锁机制,实现当前读,确保每次读取的都是最新的数据。
基于上述分析,快速判断执行的语句是当前读还是快照读:
在默认隔离级别下,select 语句默认是快照读 select a from t where id = 11
update 语句、select 语句加锁是当前读,例如:
4、快照读
又叫一致性读,读取的是快照数据,当某个数据正在被修改的时候,也可以进行读取该数据,保证读写不冲突。不加锁的简单的 SELECT 都属于快照读,即不加锁的非阻塞 读;比如: 之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于MVCC,它在很多情况下, 避免了加锁操作,降低了开销。 既然是基于多版本,那么快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。 快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读。
不同隔离级别下的快照读有所区别
在Read Committed隔离级别下,快照读和当前读读取的是一样的。因为每次select都会去读取最新的快照数据。
过程如下:
在默认隔离级别Repeatable Read下,在一个事务内,读取的都是第一次select的数据,所以可能会出现读取的数据不是最新数据的情况
过程如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。