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的结果只取决于是否 ...
随机推荐
- ROC曲线手画
绘图过程很简单:给定m个正例子,n个反例子,根据学习器预测结果进行排序,先把分类阈值设为最大,使得所有例子均预测为反例,此时TPR和FPR均为0,在(0,0)处标记一个点,再将分类阈值依次设为每个样例 ...
- Java导出Highcharts需要的3个外部jar包
xerces batik fop 这三个JAR包. 绝对可用.自本用过. 如果两个项目在同一个TOMCAT下并且同时用到xerces.jar,需要前这个外放在TOMCAT下的lib目录下.其他的容器中 ...
- codeforces793 B. Igor and his way to work (dfs)
题目链接:codeforces793 B. Igor and his way to work (dfs) 求从起点到终点转方向不超过两次是否有解,,好水啊,感觉自己代码好搓.. #include< ...
- 【模板】Splay总结
rentenglong大佬写的splay的梳理使我受益颇丰,特此做出一定的总结. 数据结构 定义了一个struct结构体. 为了在splay操作下储存根节点,我们宏定义了root 为 tree[0]. ...
- 13、SpringBoot-CRUD员工修改操作/删除
对于修改连接的uri 在list.html中 <a class="btn btn-sm btn-primary" th:href="@{/update/} + ...
- Flex控件之repeater和radioButton应用
代码:http://www.cnblogs.com/modou/articles/2108346.html <?xml version="1.0" encoding=&quo ...
- ConcurrentHashMap 中putIfAbsent 和put的区别
putIfAbsent 源代码 public V putIfAbsent(K key, V value) { Segment<K,V> s; if (value == null) thro ...
- 多线程CSerialPort类的多串口通信实现
多线程CSerialPort类的多串口通信实现 工作了之后才发现,之前在学校里真是狭隘封闭.坐井观天,拿之前发表的论文来说,工作后接触到了底层的串口.网口开发,对线程(也叫任务).操作系统时间片轮流 ...
- Flex入坑指南
弹性布局flex是一个几年前的CSS属性了,说它解放了一部分生产力不为过.至少解放了不少CSS布局相关的面试题 :) 之前网上流行的各种XX布局,什么postion: absolute+margin, ...
- springboot-自定义起步依赖
自定义起步依赖步骤: 1. 添加configuration注解文件 - 指定什么情况下加载配置 - 使用enableconfigurationProperties ...