谈谈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. Cesium原理篇:6 Render模块(6: Instance实例化)【转】

    https://www.cnblogs.com/fuckgiser/p/6027520.html 最近研究Cesium的实例化,尽管该技术需要在WebGL2.0,也就是OpenGL ES3.0才支持. ...

  2. Android Sensor 架构深入剖析【转】

    本文转载自: 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer).磁力传感器(magnetic fiel ...

  3. exception: TypeError: Cannot read property '_modulesNamespaceMap' of undefined at getModuleByNamespac

    用 Vue.extend 创造的组件构造器和组件,默认是不集成 store 和 router 的. 比如 main.js 中的这个,其实是挂载在根组件 vm 中.并不是注入到全局 Vue 中.所以你用 ...

  4. 【C#】使用C# 读取Http的Post数据

    private string Post(string num) { Encoding myEncoding = Encoding.GetEncoding("gb2312"); // ...

  5. .Net Oracle TransactionScope的使用

    IIS服务器和Oracle服务器: 1.配置msdtc允许DTC访问及启用事务 2.配置msdtc程序入站出站例外 3.数据库连接字符串不能带enlist=false标识 如下这样带enlist=fa ...

  6. qt model/view/delegate

    Qt Model/View理解(一)---构造model https://blog.csdn.net/weixin_42303052/article/details/89233887 Qt Model ...

  7. C++17新特性optional和string_view

    1. optional的作用 类模板 std::optional 管理一个可选的容纳值,即可以存在也可以不存在的值. 一种常见的 optional 使用情况是一个可能失败的函数的返回值.与其他手段,如 ...

  8. Javascript判斷function是否定義

    jQuery可以用 isFunction() 來進行判斷 如果僅使用Javascript可以使用以下的方法 function isFunction(fn){ return typeof fn === ...

  9. Linux字符设备驱动基本结构

    1.Linux字符设备驱动的基本结构 Linux系统下具有三种设备,分别是字符设备.块设备和网络设备,Linux下的字符设备是指只能一个字节一个字节读写的设备,不能随机读取设备内存中某一数据,读取数据 ...

  10. SpringBoot应用部署到Docker上(docker-io版本)

    配置TCP远程连接 为什么要配置这个呢,因为用到的docker-maven-plugin插件默认连接到localhost:2375上的docker.然而:1. 我们的Docker不在本地,执行打包命令 ...