谈谈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. 在线生成安卓APP图标

    移动应用图标/启动图生成工具,一键生成所有尺寸的应用图标/启动图 在线生成安卓APP图标生成 图标在 线 在线图标 安卓图标 生成图标 https://icon.wuruihong.com/ 在线pn ...

  2. 累积分布函数(cumulative distribution function)

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程,QQ:231469242) https://study.163.com/course/introduction.htm?courseId ...

  3. wms证书异常问题

    目前我司已定位到两个原因,详细如下, 1.  快速生成的证书存在问题,导致APACHE和NGINX显示的时间都是4号凌晨 2.  贵司在配置完成162和163两台应用的APACHE证书,以及其中10. ...

  4. python |elasticsearchs操作es的例子

    from elasticsearch import Elasticsearch import json import time es = Elasticsearch(['es地址:9200'],ign ...

  5. kubernetes reference

    hyperkube在kubernetes pod里面执行kubernetes命令(例如kubectl) https://feisky.gitbooks.io/kubernetes/components ...

  6. Kubernetes之使用kubeadm部署

    参考:https://www.cnblogs.com/caoxb/p/11243472.html 部署虚拟机规划 192.168.1.11 k8s-master 192.168.1.12 k8s-no ...

  7. DataPipeline |ApacheKafka实战作者胡夕:Apache Kafka监控与调优

    https://baijiahao.baidu.com/s?id=1610644333184173190&wfr=spider&for=pc DataPipeline |ApacheK ...

  8. (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇

    背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇

  9. activiti学习6:启动流程后动态获取流程图

    目录 activiti学习6:启动流程后动态获取流程图 一.绘图原理 二.根据流程定义id绘图 三.根据流程实例id绘图 3.1 基本原理 3.2 当前节点的获取 3.3 走过的节点的获取 3.4 绘 ...

  10. P4Merge的使用

    (官网: https://www.perforce.com/products/helix-core-apps/merge-diff-tool-p4merge 可以作为一个stand alone app ...