谈谈MySQL中的锁

锁的定义

​ 在生活中锁的例子就非常多了,所以应该很容易理解锁的含义。在计算机领域,可以这样来概述,锁是计算机协调多个进行进程并发访问某一资源的机制。

​ 在数据库中,锁也是一个非常重要的特性,DB的锁是为了支持对数据的并发访问,保证数据的一致性以及处理统一数据时不破坏事务的隔离性和一致性。

锁的机制

​ 从锁的机制来看,大致可分为乐观锁和悲观锁两类。不管是乐观锁还是悲观锁,他们是一种思想,而不是具体的锁,而且不仅仅在数据库系统中有这种概念。

乐观锁

总是假设最好的情况,每次去拿数据的时候都认为别人不会去修改,所以不上锁。但是在更新数据的时候会判断在这个期间这个数据有没有被更新。

在mysql实际使用过程中,有一种比较常用的实现方式:基于数据版本(vserion)记录机制。每当数据更新一次,version自增加1。读取数据记录时,将version值读出,当需要提交更新时,将判断当前version值与读出的值大小比较,如果一致,则进行更新,反之则说明过期,拒绝更新数据。

悲观锁

总是假设最坏的情况,每次拿数据的时候都认为别人会修改,所以每次拿数据的时候就会上锁,这样其他人想拿这个数据时就会阻塞,直到原来上锁的进程释放锁。目前大多数数据库广泛使用的锁机制就是悲观锁思想,比如行锁/表锁/页锁等。下面会进行一些锁的详细讲解。

悲观锁与乐观锁各有优点,使用到的场景不同,乐观锁实用于多读场景,而悲观锁适用于多写场景。

锁的粒度

相对其他数据库来说,Mysql的锁比较简单,但有一个特点,不同的存储引擎支持不同锁的粒度。

表锁:颗粒度最大,锁冲突的概率变大,并发度最低;开销小,加锁快,不会死锁。

页锁:mysql特有的,粒度在表锁与行锁之间,所以获取锁资源的时间上,并发度上也是介于表锁和行锁之间,同时,页锁也会出现死锁的情况。

行锁:颗粒度最小,锁冲突概率小,并发最高;开销大,加锁慢,容易死锁。

表锁适合以查询为主的业务,行锁更适合于有并发更新少量数据且有并发查询的业务。

不同引擎支持锁的粒度

引擎 表锁 页锁 行锁
InnoDB ×
MyISAM × ×
BerkeleyDB × ×

锁的类型

InnoDB存储引擎还存在着不同类型的锁,其中就包含下面两种标准的行级锁。

共享锁 S:Shared Lock 读锁 允许事务去读一行数据,阻止其他事务获得相同数据集的排他锁。

若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁 X:Exclusive Lock,写锁 允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁 。

若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

共享锁 S 与 排他锁 X 兼容性

锁类型 S锁 X锁
S锁 X
X锁 X X

另外,为了实现多粒度锁机制,同时允许多粒度锁机制,InnoDB还有两种意向锁,均为表锁。

意向共享锁 IS: 事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。 (表达一个事务想要获取一张表中某几行的共享锁) 。

意向排他锁 IX: 事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。( 表达一个事务想要获取一张表中某几行的排他锁)。

意向共享锁 S 与 意向 排他锁 X 兼容性

锁类型 IS IX S X
IS X
IX X X
S X X
X X X X X

谈谈MySQL中的锁的更多相关文章

  1. MySQL中的锁、隔离等级和读场景

    一.导言 关于MySQL中的锁还有隔离等级这类话题,其概念性的解释早已泛滥.记住其概念,算不上什么.更重要的是思考:他们的区别和联系在哪儿,为什么会有这样的概念. 1)MySQL的锁(Lock)分为行 ...

  2. MySQL系列(五)---总结MySQL中的锁

    MySQL中的锁 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 MySQL系列(四):引擎 概述 MyISAM支持表锁,InnoDB支持 ...

  3. MySQL中InnoDB锁不住表的原因

    MySQL中InnoDB锁不住表是因为如下两个参数的设置: mysql> show variables like '%timeout%'; +-------------------------- ...

  4. MySQL实战 | 06/07 简单说说MySQL中的锁

    原文链接:MySQL实战 | 06/07 简单说说MySQL中的锁 本文思维导图:https://mubu.com/doc/AOa-5t-IsG 锁是计算机协调多个进程或纯线程并发访问某一资源的机制. ...

  5. mysql中的锁表语句查看方法汇总

    mysql> show status like 'Table%'; +----------------------------+----------+ | Variable_name | Val ...

  6. 你了解MySQL中的锁吗?

    MySQL中的锁,分为全局锁.表级锁.行锁 全局锁 全局锁的意思就是,对整个数据库实例加锁,它的命令是FTWRL Flash tables with read lock 这个命令的语义是,使整个库处于 ...

  7. MySQL中的锁(表锁、行锁)

    锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...

  8. mysql中的锁

    MYSQL不同的存储引擎支持不同的锁的机制 MyISAM 支持表锁,InnoDB支持表锁和行锁 表锁,行锁比较 表锁:开销小,加锁快:不会出现死锁:锁定力度大,发生锁冲突概率高,并发度最低 行锁:开销 ...

  9. Mysql中的锁机制

    原文:http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如 ...

随机推荐

  1. CSS Blur() 将高斯模糊应用于输出图片

    一.Css  Blur() blur() CSS 方法将高斯模糊应用于输出图片. 结果为 <filter-function>. blur(radius) radius模糊的半径,值为< ...

  2. Gradle 教程: 教你配置全局国内仓库,解决新建项目卡顿,下载构建慢等问题

    想必各位从Maven 转过来的大佬们,对于maven中配置国内仓库的方法还记忆深刻.通过/用户目录下/.m2/settings.xml 局部配置或者修改全局配置.不过没有接触过maven 也不要紧,可 ...

  3. 【Linux】Linux环境变量的设置和查看

    Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 设置变量 ...

  4. jetty源码下载

    jetty下载地址:https://www.eclipse.org/jetty/download.html Release         9.4.20.v20190813 .zip .tgz api ...

  5. docker stack删除network失败

    现象描述 删除stack的时候没太多提示,但再启动相同的stack会报错,提示网络创建失败:随后使用network ls命令可以看到之前的network还在: 使用docker network rm还 ...

  6. 使用innobackupex进行mysql的差异备份还原和延迟复制

    使用innobackupex进行mysql的差异备份还原和延迟复制 背景: 有同事执行update语句没有添加where条件,导致大量脏数据,需要将这张表恢复到前一天 数据库上有备份,每周一次完整备份 ...

  7. spring与springMVC的父子容器关系

    背景和概述 在spring与springMVC中通过IOC可以管理bean对象,有两个配置文件可以配置ioc spring的配置文件applicationContext.xmlspringMVC的配置 ...

  8. spring 支持集中 bean scope?

    Spring bean 支持 5 种 scope: Singleton - 每个 Spring IoC 容器仅有一个单实例. Prototype - 每次请求都会产生一个新的实例. Request - ...

  9. [ERROR] ionic-app-scripts has unexpectedly closed (exit code 1).

    这个错误是因为缺失 '@ionic/app-scripts',只要安装 '@ionic/app-scripts' 即可. 解决方法:npm install @ionic/app-scripts@lat ...

  10. Qt编写安防视频监控系统16-设备播放

    一.前言 设备播放模块是后面增加的,核心就是通过组合rtsp视频流地址来播放实时视频和历史视频,目前市面上很多厂家比如排第一的海康都是支持直接rtsp通过NVR来播放某个通道视频流和回放某个通道的视频 ...