透过“锁”事看InnoDB对并发的处理?
一. 并发场景下的问题
相对于串行处理方式,并发的事务处理可显著提升数据库的事务吞吐量、提高资源利用率。在MySQL实际应用中,根据场景的不同,可以分为以下几类:
- 读读并发
- 读写并发
- 写写并发
在这些场景下,可能会出现更新丢失、脏读、不可重复度、幻读的问题。
- 更新丢失:当多个事务同时更新某1/n行数据时,最后提交的事务会将之前提交的更新覆盖。
- 脏读:一个事务正在插入/更新一行数据,在该事务提交之前,这条数据处于“不一致”状态。其他事务读取到这条“脏数据”并据此做进一步处理,就会产生对未提交数据的依赖关系,这种现象称为脏读。
- 不可重复读:一个事务在查询某条数据的一定时间后再次查询该数据,却发现该条数据已经发生了更新或被删除,这种现象称为不可重复读。
- 幻读:一个事务以相同的查询条件先后两次查询数据,第二次查询结果出现了第一次查询没有的新数据,这种情况称为幻读。
其中,在各类并发场景下会出现的问题如下:
- 读读并发场景不会导致数据不一致问题,因此无需特殊处理。
- 读写并发场景可能会出现脏读、不可重复读、幻读的问题。
- 写写并发场景可能会出现更新丢失的问题。
二.事务隔离级别
针对上述描述的问题,MySQL采用不同的事务隔离级别分别用于解决上述的部分问题,具体如下:
隔离级别 | 含义 | 读数据一致性 | 更新丢失 | 脏读 | 不可重复读 | 幻读 |
读未提交(Read Uncommitted) | 事务中的修改,即使没有提交,对其他事务依然可见。 | 最低级别,只能保证不读取物理上损坏的数据。 | 否 | 是 | 是 | 是 |
读已提交(Read Committed) | 只有已提交事务所做的修改才对其他事务可见。 | 语句级 | 否 | 否 | 是 | 是 |
可重复读(Repeatable Read ) | 同一事务中多次读取相同的记录结果时一致的。 | 事务级 | 否 | 否 | 否 | 否 |
串行化(Serializable) | 在读取的每一行数据上加锁,强制事务串行执行,不支持并发。 | 事务级 | 否 | 否 | 否 | 否 |
在上述隔离级别中,从上到下并发性能依次降低,安全性依次提高。InnoDB存储引擎下默认的事务隔离级别是RR,可通过如下SQL查询事务隔离级别。
- select @@global.tx_isolation;
三.事务隔离级别的实现
InnoDB对事务隔离级别的实现,基本可分为如下两种或两种的组合:
1.多版本并发控制(MVCC,Multiversion Currency Control)
MVCC可用来解决读写并发场景下的脏读、不可重复读问题。具体在不同隔离级别下的应用如下:
- RC:可解决脏读问题。
- RR:可解决脏读、不可重复读问题。
具体实现可参考这里,此处针对链接中的文章做简单补充:
相较于RC,RR之所以能够解决不可重复读问题,原因在于RR隔离级别下读取Read-View是事务级别的,RC是语句级别的。即:RR只在事务开始时读取一次Read-View,因此一个事务中的多次查询依赖同一个Read-View,能实现可重复读。RC级别下每次查询均读取 最新的Read-View,无法保证同一事务中先后读取到的Read-View是相同的,这也是先后读取到的数据有差异的原因。
2.锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据了而言显得尤为重要。
锁可以解决上述描述读写并发场景下的幻读问题、写写并发场景下的更新丢失问题。下面针对锁、锁的类型及其应用场景展开详细描述。
2.1锁的基本原理
http://mysql.taobao.org/monthly/2016/01/01/
https://mp.weixin.qq.com/s/yq5Erdv5Dft3foJEVE2dxA
https://i6448038.github.io/2019/02/23/mysql-lock/
https://www.163.com/dy/article/G0S7FSGG05319WXB.html
duplicate key check检查时需要在二级唯一索引上加gap lock(版本:5.6之前,5.7.26-29之后加record lock)
https://juejin.cn/post/6844903597029720072
https://my.oschina.net/hebaodan/blog/3045246
死锁发生场景:
- 事务1,2均获取某一行数据的s锁后,均想获取x锁。
- 事务1,2均获取到某一间隙锁后,希望进行插入操作,即增加插入意向锁。
- 事务1,2操作同一条数据。由于检索条件不同,事务1,2分别锁定了聚簇索引和二级索引,然后事务1无法操作二级索引(先删除,再插入),事务2无法操作聚簇索引,发生死锁。(参考http://mysql.taobao.org/monthly/2016/01/01/)
透过“锁”事看InnoDB对并发的处理?的更多相关文章
- Java并发(九)【转载】不可不说的Java“锁”事
转载自 美团技术团队,原文链接 不可不说的Java“锁”事 前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK ...
- 你用对锁了吗?浅谈 Java “锁” 事
每个时代,都不会亏待会学习的人 大家好,我是yes. 本来打算继续写消息队列的东西的,但是最近在带新同事,发现新同事对于锁这方面有一些误解,所以今天就来谈谈"锁"事和 Java 中 ...
- InnoDB高并发原理
一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...
- Netty的那些”锁”事
Netty锁事的五个关键点: ① 在意锁的对象和范围 --> 减少粒度 ② 注意锁的对象本身大小 --> 减少空间占用 ③ 注意锁的速度 --> 提高速度 ④不同场景选择不同 ...
- MySQL锁:02.InnoDB锁
目录 InnoDB锁 InnoDB行锁实现机制 InnoDB隐式.显式锁 InnoDB锁类型 共享锁 排他锁 意向锁 InnoDB锁兼容性 InnoDB行锁范围.粒度 InnoDB行锁粒度一览 意向插 ...
- MySQL锁:03.InnoDB行锁
目录 InnoDB 行锁 锁排查可以用的视图和数据字典 InnoDB 行锁兼容性 InnoDB行锁之共享锁 共享锁: 查看InnoDB锁 InnoDB行锁实现机制 对普通索引上锁 InnoDB隐式.显 ...
- 怎么看innodb的B+TREE层数?
怎么看innodb的B+TREE层数?,下面以sysbench_testdata.sbtest2为例查看索引层数: - 查看相关系统 root@localhost [sysbench_testdata ...
- [转]透过 Linux 内核看无锁编程
非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...
- MySQL MyISAM/InnoDB高并发优化经验
最近做的一个应用,功能要求非常简单,就是 key/value 形式的存储,简单的 INSERT/SELECT,没有任何复杂查询,唯一的问题是量非常大,如果目前投入使用,初期的单表 insert 频率约 ...
随机推荐
- Tomcat详解系列(3) - 源码分析准备和分析入口
Tomcat - 源码分析准备和分析入口 上文我们介绍了Tomcat的架构设计,接下来我们便可以下载源码以及寻找源码入口了.@pdai 源代码下载和编译 首先是去官网下载Tomcat的源代码和二进制安 ...
- Ansible-Playbook中的变量使用
变量名:仅能由字母.数字和下划线组成,且只能以字母开头 变量来源: 1.ansible all -m setup 远程主机的所有变量都可直接调用 #显示所有变量 ansible all -m setu ...
- 痞子衡嵌入式:MCUXpresso IDE下在线调试时使用不同复位策略的现象总结
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线调试时使用不同复位策略的现象总结. 本篇实际上是<IAR在线调试时设不同复位类型可能会导致i.M ...
- Java读取图片exif信息实现图片方向自动纠正
起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ...
- HTML前世今生
HTML贯穿了整个互联网的发展史,就目前来看,它还会继续下去,因为HTTP和HTTPS协议在互联网中传输的主要内容,也是用户浏览的最终页面管理内容,接下来就来扒一扒HTML的前世今生. 历史舞台已交给 ...
- 「Spring Boot 2.4 新特性」一键构建Docker镜像
背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugi ...
- DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
DevEco Device Tool迎来了2.1 Beta1,其中的亮点之一是:支持Hi3861开发板的源码在Windows平台编译.带着浓厚的兴趣,第一时间做了一次体验. 首先在官网下载" ...
- Oracle-buffer cache过小导致SQL执行时间长
一.问题:客户反馈在生产库和测试库执行相同SQL,测试库执行比生产库慢一倍 问题摆在这里,需要进行分析? 啥??? 版本11.2.0.4,都是单实例,主机系统硬件配置差不多. 二.对比SQL的执行效率 ...
- 【Scrapy(一)】 Scrapy爬虫的基础执行流程
安装scrapy模块 : pip install scrapy 创建scrapy项目 1.scrapy startprojecty 项目名称 注意:如果创建失败,可以先卸载原有的scrapy模块, ...
- hdu 1044 BFS(压缩图)+DFS
题意: 给你起点,终点,图上有墙有路还有宝物,问你在规定时间内能否能到终点,如果能问最多能捡到多少宝物. 思路: 看完这个题目果断 BFS+三维的mark ...