当前位置: 首页 > news >正文

【MYSQL】当前读和快照读

前言

复习下隔离级别:
1、读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
2、读提交:一个事务提交之后,它做的变更会被其他事务看到
3、可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交的数据对其他事务不可见
4、串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行

当前读 & 快照读

表记录有两种读取方式。
1、快照读:读取的是快照版本。普通的SELECT就是快照读。通过mvcc来进行并发控制的,不用加锁。(不加锁)
2、当前读:读取的是最新版本。UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE是当前读。(加锁)

快照读情况下,InnoDB通过mvcc机制避免了幻读现象。而mvcc机制无法避免当前读情况下出现的幻读现象。因为当前读每次读取的都是最新数据,这时如果两次查询中间有其它事务插入数据,就会产生幻读。

MySQL是如何避免幻读
在快照读情况下,MySQL通过mvcc来避免幻读。
在当前读情况下,MySQL通过next-key来避免幻读(加行锁和间隙锁来实现的)。
next-key包括两部分:行锁和间隙锁。行锁是加在索引上的锁,间隙锁是加在索引之间的。

Serializable隔离级别也可以避免幻读,会锁住整张表,并发性极低,一般不会使用。

在可重复读下,快照读和当前读怎么实现

1、快照读是通过MVCC(多版本控制)和undo log来实现的
2、当前读是通过加record lock(记录锁)和gap lock(间隙锁)来实现的。如果需要实时显示数据,还是需要通过加锁来实现。这个时候会使用next-key技术来实现。

在mysql中,提供了两种事务隔离技术,第一个是mvcc,第二个是next-key技术(record lock行锁 + gap lock间隙锁)。
不加lock inshare mode之类的就使用mvcc。否则使用next-key。
mvcc的优势是不加锁,并发性高。缺点是不是实时数据。
next-key的优势是获取实时数据,但是需要加锁。

快照是什么时候生成的

1、在读未提交隔离级别下,快照是什么时候生成的?
没有快照,因为不需要,怎么读都读到最新的。不管是否提交

2、在读已提交隔离级别下,快照是什么时候生成的?
SQL语句开始执行的时候。

3、在可重复读隔离级别下,快照是什么时候生成的?
事务开始的时候(可能会有很多条select SQL语句执行,快照生命周期是到事务结束的时候)

4、在串行化隔离级别下,快照是什么时候生成的?
“写”会加“写锁”,“读”会加“读锁”,读的的数据都是当前最新的数据(没有快照,当前读)

怎么知道当前执行语句是当前读还是快照读

1、在默认隔离级别(可重复读)下,select语句默认是快照读

select * from table id = 1;

2、select语句加锁是当前读

 共享锁
select * from table id = 1 lock in share mode;排他锁
select * from table where id = 1 for update;

3、update、insert、delete 语句当前读(行锁)

update table set a = 1;
delete from table where id = 1;
inert into table ...
http://www.lryc.cn/news/423455.html

相关文章:

  • C语言-使用数组法,指针法实现将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。
  • Android gradle 构建
  • vulnhub系列:devguru
  • Robot Operating System——高质量图像传输
  • NLP_情感分类_预训练加微调方案
  • 全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典
  • DataWind看板绘制案例
  • Golang | Leetcode Golang题解之第335题路径交叉
  • C# 在Word中插入或删除分节符
  • 基于STM32+Qt设计的无人超市收银系统(206)
  • 开源免费的表单收集系统TDuck
  • Python 生成器、迭代器、可迭代对象 以及应用场景
  • 马斯克对欧盟的反应
  • uniapp + 安卓APP + H5 + 微信小程序实现PDF文件的预览和下载
  • Elasticsearch 8 RAG 技术分享
  • 根据字典值回显,有颜色的
  • 多台PC网络ADB连接同一台RK3399 Android7.1.2设备
  • 前端黑科技:使用 JavaScript 实现网页扫码功能
  • 【人工智能】全景解析:【机器学习】【深度学习】从基础理论到应用前景的【深度探索】
  • MySQL与PostgreSQL语法区别
  • vue2+OpenLayers 天地图上凸显出当前地理位置区域(4)
  • 基于Python、Django开发Web计算器
  • 高性能并行计算面试-核心概念-问题理解
  • java-activiti笔记
  • Layui——隐藏表单项后不再进行验证
  • Github Copilot 使用技巧
  • 【实现100个unity特效之20】用unity实现物品悬浮和发光像素粒子特效
  • GPT-4o mini发布,轻量级大模型如何颠覆AI的未来?
  • 高性能的 C++ Web 开发框架 CPPCMS + WebSocket 模拟实现聊天与文件传输案例。
  • 合合信息OCR支持30类国内常见票据一站式分类识别,支持医疗发票、数电票识别