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的结果只取决于是否 ...
随机推荐
- commons.pool2 对象池的使用
commons.pool2 对象池的使用 ? 1 2 3 4 5 <dependency> <groupId>org.apache.commons</groupI ...
- 利用SPF记录缺失发送伪造邮件
SPF,也就是 Sender Policy Framework 的缩写,是一种以IP地址认证电子邮件发件人身份的技术,是非常高效的垃圾邮件解决方案. 如何查询所属域名邮箱的SPF记录? 查询的结果,从 ...
- 关于使用eclipse maven UpdateProject时报错,无法更新本地仓库的问题解决方案
在做项目中,需要从同事电脑中把Maven项目copy过来,但是copy的过程中只copy了代码,setting.xml文件和pom.xml,使用eclipse把项目导入,有红色的感叹号提示,由于我没有 ...
- jQuery Cookie操作cookie
jQuery cookie下载地址:http://plugins.jquery.com/cookie/ 使用jquery.cookie.js依赖于jquery 基本用法: 1. 创建cookie ...
- ASP.NET Core MVC的路由参数中:exists后缀有什么作用,顺便谈谈路由匹配机制
我们在ASP.NET Core MVC中如果要启用Area功能,那么会看到在Startup类的Configure方法中是这么定义Area的路由的: app.UseMvc(routes => { ...
- http://imgbase64.duoshitong.com/ 图片转换 base64
base64图片工具介绍: 1.支持 PNG.GIF.JPG.BMP.ICO 格式. 2.将图片转换为Base64编码,可以让你很方便地在没有上传文件的条件下将图片插入其它的网页.编辑器中. 这对于一 ...
- Eclipse新导入的项目中ctrl+点击指定方法名或类名没有反应,不能跳转问题
项目没有转成java项目 解决方法:右击项目名---选择properties----点击Project Facets,这样就可以实现ctrl+左键点击跳转了. 转成java项目后会报错 解决办法:选中 ...
- 个人免签即时到账收款接口 bufpay.com 支持多账号收款
有很多 bufpay 的用户反馈,单个手机收款有些时候不太方便,切换手机太麻烦:或者是营业额比较多,希望分摊到多个账号上面. 基于以上的问题,bufpay 开发了多手机收款的功能:每个收款的手机安装 ...
- MySQL学习【SQL语句上】
1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql -uroot -p ...
- 关于Hibernate的部分知识总结
[部分内容参考地址:https://www.cnblogs.com/woniu2219/p/7111857.html] Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对J ...