MySQL高级篇——锁的概述与案例应用
文章目录:
1.锁的概述
2.MySQL并发事务访问相同记录
2.1 读-读情况
2.2 写-写情况
2.3 读-写或写-读情况
2.4 并发问题的解决方案
3.锁的不同角度分类
3.1 从数据操作的类型划分:读锁、写锁
3.2 从数据操作的粒度划分:表级锁、页级锁、行锁
3.2.1 表锁——读锁、写锁
3.2.2 表锁——意向锁
3.2.3 行锁——记录锁
3.2.4 行锁——间隙锁
3.2.5 行锁——临键锁
3.2.6 行锁——插入意向锁
3.2.7 页锁
3.3 从对待锁的态度划分:乐观锁、悲观锁
3.3.1 悲观锁
3.3.2 乐观锁
3.3.3 对比
3.4 全局锁
3.5 死锁
1.锁的概述
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对 并发操作进行控制 ,因此产生了 锁 。同时 锁机制 也为实现MySQL的各个隔离级别提供了保证。 锁冲突 也是影响数据库 并发访问性能 的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。
2.MySQL并发事务访问相同记录
2.1 读-读情况
读-读 情况,即并发事务相继 读取相同的记录 。读取操作本身不会对记录有任何影响,并不会引起什么问题,所以允许这种情况的发生。
2.2 写-写情况
写-写 情况,即并发事务相继对相同的记录做出改动。 在这种情况下会发生 脏写 的问题,任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务相继对一条记录做改动时,需要让它们 排队执行 ,这个排队的过程其实是通过 锁 来实现的。这个所谓的锁其实是一个 内存中的结构 ,在事务执行前本来是没有锁的,也就是说一开始是没有 锁结构 和记录进行关联的。当一个事务想对这条记录做改动时,首先会看看内存中有没有与这条记录关联的 锁结构 ,当没有的时候就会在内存中生成一个 锁结构 与之关联。比如,事务 T1 要对这条记录做改动,就需要生成一个 锁结构 与之关联:
小结几种说法:不加锁 :意思就是不需要在内存中生成对应的 锁结构 ,可以直接执行操作。获取锁成功,或者加锁成功:意思就是在内存中生成了对应的 锁结构 ,而且锁结构的 is_waiting 属性为 false ,也就是事务可以继续执行操作。获取锁失败,或者加锁失败,或者没有获取到锁:意思就是在内存中生成了对应的 锁结构 ,不过锁结构的 is_waiting 属性为 true ,也就是事务需要等待,不可以继续执行操作。
2.3 读-写或写-读情况
读-写 或 写-读 ,即一个事务进行读取操作,另一个进行改动操作。这种情况下可能发生 脏读 、 不可重复读 、 幻读 的问题。各个数据库厂商对 SQL标准 的支持都可能不一样。比如MySQL在 REPEATABLE READ 隔离级别上就已经解决了 幻读 问题。
2.4 并发问题的解决方案
怎么解决 脏读 、 不可重复读 、 幻读 这些问题呢?其实有两种可选的解决方案:方案一:读操作利用多版本并发控制( MVCC ,下章讲解),写操作进行 加锁 。普通的SELECT语句在READ COMMITTED和REPEATABLE READ隔离级别下会使用到MVCC读取记录。在 READ COMMITTED 隔离级别下,一个事务在执行过程中每次执行SELECT操作时都会生成一个ReadView,ReadView的存在本身就保证了 事务不可以读取到未提交的事务所做的更改 ,也就是避免了脏读现象;在 REPEATABLE READ 隔离级别下,一个事务在执行过程中只有 第一次执行SELECT操作 才会生成一个ReadView,之后的SELECT操作都 复用 这个ReadView,这样也就避免了不可重复读和幻读的问题。方案二:读、写操作都采用 加锁 的方式。小结对比发现:采用 MVCC 方式的话, 读-写 操作彼此并不冲突, 性能更高 。采用 加锁 方式的话, 读-写 操作彼此需要 排队执行 ,影响性能。一般情况下我们当然愿意采用 MVCC 来解决 读-写 操作并发执行的问题,但是业务在某些特殊情况下,要求必须采用 加锁 的方式执行。下面就讲解下MySQL中不同类别的锁。
3.锁的不同角度分类
3.1 从数据操作的类型划分:读锁、写锁
读锁 :也称为 共享锁 、英文用 S 表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。写锁 :也称为 排他锁 、英文用 X 表示。当前写操作没有完成前,它会阻断其他写锁和读锁。这样就能确保在给定的时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的同一资源。需要注意的是对于 InnoDB 引擎来说,读锁和写锁可以加在表上,也可以加在行上。
下面进行简单的案例测试:
MySQL高级篇——锁的概述与案例应用相关推荐
- mysql高级篇学习笔记
目录 前言 1 mysql安装及运行(linux环境) 1.1 安装前检查 1.2 MySQL卸载 ①**关闭 mysql 服务** ②**查看当前 mysql 安装状况** ③**卸载上述命令查询出 ...
- MySQL高级篇知识点——索引优化与查询优化
目录 1.数据准备 1.1.建库建表 1.2.创建相关函数 1.3.创建存储过程 1.4.调用存储过程 1.5.删除某表上的索引 2.索引失效案例 2.1.全值匹配 2.2.最佳左前缀匹配原则 2.3 ...
- MySQL高级篇(事务视图存储过程与函数)
目录 一.事务 1.1什么是事务? 1.2事务的特性 1.3事务的分类 1.4事务的操作步骤 1.5事务的隔离级别(面试题常考) 二.视图 2.1视图的操作 2.1.1视图的创建 2.1.2视图更新( ...
- 深入浅出Mysql - 优化篇(锁)
深入浅出Mysql - 优化篇(锁) 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保 ...
- 【MySQL高级篇笔记-MySQL事务日志(下) 】
此笔记为尚硅谷MySQL高级篇部分内容 目录 一.redo日志 1.为什么需要REDO日志 2.REDO日志的好处.特点 3.redo的组成 4.redo的整体流程 5.redo log的刷盘策略 6 ...
- mysql高级篇(二)mysql索引优化分析
mysql高级篇笔记 mysql高级篇(一)mysql的安装配置.架构介绍及SQL语句的复习. mysql高级篇(二)mysql索引优化分析. mysql高级篇(三)查询截取分析(慢查询日志).主从复 ...
- MySQL高级篇知识点——其它数据库日志
目录 1.其他数据库日志 1.1.日志类型 1.2.日志的弊端 2.慢查询日志 (slow query log) 3.通用查询日志 (general query log) 3.1.问题场景 3.2.查 ...
- 【MySQL高级篇】第15章_锁
第15章_锁 1. 概述 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的 资源.为保证数据的一致性,需要对 并发操作进行控制 ,因此产生了 锁 .同 ...
- 程序猿必备技能之MySQL高级篇
MySQL是我们非常常用的关系型数据库,非常重要,所以在这里给大家整理下MySQL的高级内容. 1. MySQL高级特性 1.1. MySQL体系结构 Client Connectors: 接入方 ...
- MySql基础篇---001 数据库概述与MySQL安装篇:概述,表和类对应关系,表关系、数据库卸载,下载,安装,配置,启动,登录,演示,图形化工具,目录结构,常见问题
第01章_数据库概述 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储 ...
最新文章
- Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6
- 学习资源:在线学习 Python(二)
- 5233杨光--第十一周学习总结
- 网易云音乐社交玩法的背后,听说有一只神秘部队保驾护航?
- 理解Go语言中的方法和接收者
- 华为手机改定位怎么改变_华为推送HMS服务,依靠鸿蒙OS,或将改变手机行业格局...
- C++ 复杂、内存漏洞,2019 年的软件开发并不安全!
- python读取数据流_IOError:读取图像fi时数据流中断
- 谷歌浏览器清除百度广告
- oracle18c安装教程6,Oracle 18c rpm 安装及解析安装过程
- 架构师的自我修养,厉害啦
- 背诵考研英语单词计划总览
- Asset Pricing:Introduction
- java培训包装简历模板
- error while loading shared libraries: librosconsole.so: cannot open shared object file: No such file
- 22考研基础阶段计划;超七成考研人已开始复习!
- python文件处理——encoding参数,utf-8,gbk
- 专利快速预审主体备案服务指南
- glusterfs Connection failed. Please check if gluster daemon is operational. 解决方法
- 基于MinIO/Deleta Lake/Dremio和Superset或Metabase搭建简单的数据湖
热门文章
- 关于中国电信天翼开放平台短信接口的一些使用
- 两组的数据平均值合并_数据平均值合并计算 合并计算求平均值
- iOS项目添加pch文件
- 【Ranger】编译问题An Ant BuildException has occured: exec returned: 1
- 《深入理解计算机系统》实验四Architecture Lab
- VB中如何声明及使用多维数组,多层数组及动态数组
- Ubuntu 15.10 x64 安装 Android SDK
- 中兴olt xpon开局及业务配置以及原理
- FusionSphere虚拟化套件
- 南京oracle认证考试,南京Oracle认证考试-Oracle认证Web组件开发专家(OCWCD)-南京万和...