MySQL高级第四章——MySQL的锁机制
一、概述
1.定义
锁是计算机协调多个进程或线程并发访问某一资源的限制。
2.分类
操作类型来分:
读锁(共享锁)和写锁(排它锁)
数据粒度来分:
表锁和行锁
二、三锁
1.表锁——偏读
特点:
偏向 MyISAM 引擎,开销小,加锁快,无死锁,粒度大,并发低。
常用命令:
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。给MyISAM表显示加锁,一般是为了一定程度模拟事务操作,实现对某一时间点多个表的一致性读取。
查看表被锁的情况:SHOW OPEN TABLES;
//0即表示未被锁住
给表加锁:LOCK TABLE tb_name read(write) 可加读写锁(即共享锁和排它锁)
给表解锁:UNLOCK TABLES;
分析锁的情况:SHOW STATUS LIKE ‘table%’;
//分别表示产生表锁次数,以及等待锁次数
读锁
我们使用上述加锁命令显式地给某张表加读锁 :LOCK TABLE t_mylock read;这时候模拟开两个终端(s1,s2)进行模拟。(假设是是在s1中加锁)
可以发现,s1加的读锁,自己只能读这张表,不能写这张表,也不能读其他表(必须等待释放栈);
而s2由于s1开的为共享锁,可以读锁的表,也可以读其它表,但不能直接写锁住的表(必须等待s1释放锁),只能处于阻塞状态。
写锁
与加读锁类似,通过s1给t_mylock表加上写锁:LOCK TABLE t_mylock write;由于写锁是排它锁,
可以发现:s1可以读也可以写自己锁住的表(排它锁,可以为所欲为),但是自己不能读其它表(没释放,还有笔账没请呢);
s2查其它表没问题,查锁住的表同样会阻塞(被加排它锁,被锁住了)
关于表锁详细,可以参见:http://www.cnblogs.com/chenqionghe/p/4845693.html
2.行锁——偏写
特点:
偏向 InnoDB 引擎,开销大,加锁慢,有死锁,粒度小,并发高。
由此知道InnoDB 与 MyISAM的最大不同——1是支持事务,2是采用行锁。
事务的复习不在这里展开。
加锁分析:
测试环境下,关闭自动提交(SET AUTOCOMMIT=0);若s1与s2同时操作同一行记录(例如同时update),则后一个会被阻塞。
索引失效导致行锁变表锁:
之前索引章节提到的,VARCHAR类型必须必须加引号 '',例如a INT,b VARCHAR两列,b列加了索引,当执行:UPDATE t_lock SET b=1008 WHERE a=1;时,将会产生严重后果:行锁变表锁,此时在未提交的过程中(设置不自动提交)其它列的操作将会被阻塞!无法修改。
间隙锁危害:
间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。
针对的是范围的操作,例如操作 a>1 and a<6;会锁定2345,即使2并不存在
关于间隙锁的更多介绍,请参见:http://www.jianshu.com/p/bf862c37c4c9
手动锁住某一行:
SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM emp WHERE id = 1 FOR UPDATE;——锁定一行
(COMMIT)
查看行锁情况:
SHOW STATUS LIKE ‘innodb_row_lock%’;
行锁的建议:
MySQL高级第四章——MySQL的锁机制的更多相关文章
- 第四章 MySQL高级查询(二)
第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...
- MySQL数据库InnoDB存储引擎中的锁机制
MySQL数据库InnoDB存储引擎中的锁机制 http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...
- “全栈2019”Java多线程第二十四章:等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- MySQL高级知识(十三)——表锁
前言:锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算机资源(如CPU.RAM.I/O等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...
- 第四章 MySQL数据类型和运算符
5.1 MySQL数据类型介绍 一.数据类型简介 (1) 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容 (2) 不同的数据类型也决定了 My ...
- Mysql系列(四) —— MySQL的Charset和Collation
本文转载自:再见乱码:5分钟读懂MySQL字符集设置 一.内容概述 在MySQL的使用过程中,了解字符集.字符序的概念,以及不同设置对数据存储.比较的影响非常重要.不少同学在日常工作中遇到的" ...
- Mysql数据库(十一)事务与锁机制
一.事务机制 1.事务的概念 事务是指一组互相依赖的操作单元的集合,用来保证对数据库的正确修改,保持数据的完整性,如果一个事务的某个单元操作失败,将取消本次事务的全部操作. 比如将A账户的资金转入B账 ...
- MySQL学习之路(一)锁机制
1 锁的分类 1.1 操作类型 读锁(共享锁):针对同一份数据,多个操作可以同时进行而不会互相影响 写锁(排它锁):当写操作没有完成前,它会阻塞其他读锁或者写锁 1.2 操作粒度 表锁:锁住整张表 行 ...
- JAVA / MySql 编程—— 第四章 高级查询(二)
1. EXISTS和NOT EXISTS子查询:EXISTS关键字用来检测数数据库对象是否存在. ★EXISTS和NOT EXISTS的结果只取决于是否 ...
随机推荐
- 总结一下MVC思想
MVC (Model View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用 ...
- codeforces 814D An overnight dance in discotheque
题目链接 正解:贪心. 首先我们可以计算出每个圆被多少个圆覆盖. 很显然,最外面的圆是肯定要加上的. 然后第二层的圆也是要加上的.那么第三层就不可能被加上了.同理,第四层的圆又一定会被加上. 然后我们 ...
- BZOJ1770:[USACO]lights 燈(高斯消元,DFS)
Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...
- Mac系统下配置JAVA Maven Ant 环境变量
Mac 启动加载文件位置(可设置环境变量) ------------------------------------------------------- (1)首先要知道你使用的Mac OS X是什 ...
- win7 xampp php7 yii2 配置sqlserver
第一步: https://www.microsoft.com/en-us/download/details.aspx?id=20098 下载 如下图 php7 版本 放到 xampp\php ...
- Windows 使用iCloud日历
作者:Lumos Night链接:https://www.zhihu.com/question/34287617/answer/97299386来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- 检查BUG插件 代码规范(Findbugs)插件 安装以及使用(idea)
使用findbugs进行检查代码规范 Findbugs很多人都并不陌生,Eclipse中有插件可以帮助查找代码中隐藏的bug,IDEA中也有这款插件.这个插件可以帮助我们查找隐藏的bug,比较重要的功 ...
- Knowledge Point 20180305 Java程序员详述编码Unicode
Unicode Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设 ...
- 在CentOS7上安装MySQL5.7-YUM源方式
获取RPM包 # wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 列出RPM包里都有哪些文件 # ...
- CSS之元素
CSSS书写位置 内嵌式 <head> <style type = "text/css"> **** </style> </head> ...