文章目录:

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高级篇——锁的概述与案例应用相关推荐

  1. mysql高级篇学习笔记

    目录 前言 1 mysql安装及运行(linux环境) 1.1 安装前检查 1.2 MySQL卸载 ①**关闭 mysql 服务** ②**查看当前 mysql 安装状况** ③**卸载上述命令查询出 ...

  2. MySQL高级篇知识点——索引优化与查询优化

    目录 1.数据准备 1.1.建库建表 1.2.创建相关函数 1.3.创建存储过程 1.4.调用存储过程 1.5.删除某表上的索引 2.索引失效案例 2.1.全值匹配 2.2.最佳左前缀匹配原则 2.3 ...

  3. MySQL高级篇(事务视图存储过程与函数)

    目录 一.事务 1.1什么是事务? 1.2事务的特性 1.3事务的分类 1.4事务的操作步骤 1.5事务的隔离级别(面试题常考) 二.视图 2.1视图的操作 2.1.1视图的创建 2.1.2视图更新( ...

  4. 深入浅出Mysql - 优化篇(锁)

    深入浅出Mysql - 优化篇(锁) 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保 ...

  5. 【MySQL高级篇笔记-MySQL事务日志(下) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一.redo日志 1.为什么需要REDO日志 2.REDO日志的好处.特点 3.redo的组成 4.redo的整体流程 5.redo log的刷盘策略 6 ...

  6. mysql高级篇(二)mysql索引优化分析

    mysql高级篇笔记 mysql高级篇(一)mysql的安装配置.架构介绍及SQL语句的复习. mysql高级篇(二)mysql索引优化分析. mysql高级篇(三)查询截取分析(慢查询日志).主从复 ...

  7. MySQL高级篇知识点——其它数据库日志

    目录 1.其他数据库日志 1.1.日志类型 1.2.日志的弊端 2.慢查询日志 (slow query log) 3.通用查询日志 (general query log) 3.1.问题场景 3.2.查 ...

  8. 【MySQL高级篇】第15章_锁

    第15章_锁 1. 概述 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的 资源.为保证数据的一致性,需要对 并发操作进行控制 ,因此产生了 锁 .同 ...

  9. 程序猿必备技能之MySQL高级篇

      MySQL是我们非常常用的关系型数据库,非常重要,所以在这里给大家整理下MySQL的高级内容. 1. MySQL高级特性 1.1. MySQL体系结构 Client Connectors: 接入方 ...

  10. MySql基础篇---001 数据库概述与MySQL安装篇:概述,表和类对应关系,表关系、数据库卸载,下载,安装,配置,启动,登录,演示,图形化工具,目录结构,常见问题

    第01章_数据库概述 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储 ...

最新文章

  1. Ubuntu14.04 64bit 编译安装nginx1.7+php5.4+mysql5.6
  2. 学习资源:在线学习 Python(二)
  3. 5233杨光--第十一周学习总结
  4. 网易云音乐社交玩法的背后,听说有一只神秘部队保驾护航?
  5. 理解Go语言中的方法和接收者
  6. 华为手机改定位怎么改变_华为推送HMS服务,依靠鸿蒙OS,或将改变手机行业格局...
  7. C++ 复杂、内存漏洞,2019 年的软件开发并不安全!
  8. python读取数据流_IOError:读取图像fi时数据流中断
  9. 谷歌浏览器清除百度广告
  10. oracle18c安装教程6,Oracle 18c rpm 安装及解析安装过程
  11. 架构师的自我修养,厉害啦
  12. 背诵考研英语单词计划总览
  13. Asset Pricing:Introduction
  14. java培训包装简历模板
  15. error while loading shared libraries: librosconsole.so: cannot open shared object file: No such file
  16. 22考研基础阶段计划;超七成考研人已开始复习!
  17. python文件处理——encoding参数,utf-8,gbk
  18. 专利快速预审主体备案服务指南
  19. glusterfs Connection failed. Please check if gluster daemon is operational. 解决方法
  20. 基于MinIO/Deleta Lake/Dremio和Superset或Metabase搭建简单的数据湖

热门文章

  1. 关于中国电信天翼开放平台短信接口的一些使用
  2. 两组的数据平均值合并_数据平均值合并计算 合并计算求平均值
  3. iOS项目添加pch文件
  4. 【Ranger】编译问题An Ant BuildException has occured: exec returned: 1
  5. 《深入理解计算机系统》实验四Architecture Lab
  6. VB中如何声明及使用多维数组,多层数组及动态数组
  7. Ubuntu 15.10 x64 安装 Android SDK
  8. 中兴olt xpon开局及业务配置以及原理
  9. FusionSphere虚拟化套件
  10. 南京oracle认证考试,南京Oracle认证考试-Oracle认证Web组件开发专家(OCWCD)-南京万和...