MYSQL进阶学习笔记八:MySQL MyISAM的表锁!(视频序号:进阶_18-20)
知识点九:MySQL MyISAM表锁(共享读锁)(18)
为什么会有锁:
打个比方,我们到淘宝买一件商品,商品只有一件库存,这时候如果还有另外一个人也在买,那么如何解决是你买到还是另一个人买到的问题?
我们先从库存表中取出物品的数量,然后插入订单,付款后插入付款表信息,然后更新商品数量。在这个情况过程中,使用锁可以对有限的资源进行保护,解决隔离和并发的矛盾!
锁的概念:
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的
一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度说,锁对数据库而言显得尤其重要,也更加复杂。
MySQL锁的概述:
相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
比如:MyISAM和MEMORY存储引擎采用的是表级锁(table- leavel locking);;
BOD存储引擎采用的是页面锁(page- leavel locking);
InnoDB存储引擎既支持行级锁(row-leavel locking),也支持表级锁,但默认情况下采用行级锁。
MySQL这三种锁的特性可大致归纳如下:
|
锁名称 |
开销 |
加锁速度 |
死锁 |
粒度 |
并发性能 |
|
表级锁 |
开销小 |
加锁快 |
不会出现死锁 |
锁定粒度大 |
发生锁冲突的概率最高,并发度最低 |
|
行级锁 |
开销大 |
加速慢 |
会出现死锁 |
锁定粒度最小 |
发生锁冲突的概率最低,并发度也最高 |
|
页面锁 |
开销和加锁时间界于表锁与行锁之间 |
会出现死锁 |
锁定粒度界于表锁和行锁之间 |
并发度一般 |
|
仅从锁的角度来说:
表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如WEB应用;
而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。
从上述特点可见,很难笼统地说哪些锁更好,只能就具体应用的特点来说哪种锁更合适。
1.MyISAM表锁:
MySQL的表级锁有两种模式:表共享度锁(Table Read Lock)和表独占写锁(Table Write Lock)
MySQL中的表锁兼容性
|
请求锁模式 是否兼容 当前锁模式 |
None |
读锁 |
写锁 |
|
度锁 |
是 |
是 |
否 |
|
写锁 |
是 |
否 |
否 |
说明:
对于MyISAM表的读写操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表写的请求;
对MyISAM表的写的操作,则会阻塞其他用户对同一表的读和写的操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!
当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新的操作。其他线程的读,写操作都会等待,直到锁被释放为止。
一个session使用LOCK TABLE命令给表添加了读锁,这个session可以查询锁定表的记录,但更新或者访问其他表都会提示错误;同时,另外一个session可以查询表中的记录,但更新就会出现锁等待。
给表加锁:
1.加共享读锁:lock table 表名 read
2.表独占写锁:lock table 表名 read
解锁:
unlock tables;
查看表中有什么样的等待:
SHOW VARIABLES LIKE '%table%';
查看锁的状态:
SHOW STATUS LIKE '%table%';
查看表级锁的争用情况:
Table_locks_waited:越低越好
--把mzjj数据库到处并且添加到test_myisam
mysqldump -uroot -p --default-character-set=utf8 -d mzjj>D:/cc.sql --导出表信息
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=utf8 mzjj>D:/cc1.sql --导出表内容
CTRATE DATABASE test_myisam --创建数据库
mysql -uroot -p test_myisam<D:/cc.sql --导入表信息
mysql -uroot -p test_myisam<D:/cc1.sql --导入表内容 --一客户端
LOCK TABLE employees read;
--二客户端
UPDATE employees SET first_name='yu' WHERE emp_no=1001;
--一客户端
UNLOCK TABLES; --二客户端
LOCK TABLE employees read;
--一客户端
INSERT INTO employees VALUES(1002,'1991-1-4','ty','io','M','2014-1-1'); SHOW VARIABLES LIKE '%table%';
SHOW STATUS LIKE '%table%';
--二客户端
UNLOCK TABLES;
共享读锁测试
知识点十:MySQL MyISAM表锁(独占写锁)(19,20)
MyISAM共享读锁:
1. 一个session使用LOCK TABLE 命令给表加了读锁,这个sessoin可以查询锁定表中的记录,但更新或者访问其他表都会提示错误。
2. 当使用LOCK TABLES是,不仅需要一次锁定用到的所有表,而且,同一个表的SQL语句中出现多少次,就要通过与SQL语句相同的别名锁定多少次,否侧也会出错。
格式:
LOCK TABLE 表名 AS 别名 READ;
-- 独占写锁
--一客户端
LOCK TABLE employees write;
--二客户端
SELECT * FROM employees; --读不了
--一客户端
INSERT INTO employees VALUES(1005,'1991-1-4','ty','io','M','2014-1-1');
UPDATE employees SET gender='F' WHERE emp_no=1005;
DELETE FROM employees WHERE emp_no=1005;
SELECT * FROM employees;
SHOW VARIABLES LIKE '%table%';
SHOW STATUS LIKE '%table%';
UNLOCK TABLES; --一客户端
LOCK TABLE employees READ;
SELECT * FROM employees AS a;--读不了
LOCK TABLE employees AS a READ;
SELECT * FROM employees AS a;
UNLOCK TABLES; --一客户端
LOCK TABLE employees READ;
SELECT * FROM employees;--可以读
SELECT * FROM salaries;--读不了,因为salaries没加锁
UNLOCK TABLES; --一客户端
LOCK TABLE employees WRITE;
SELECT * FROM employees;--可以读
SELECT * FROM salaries;--读不了,因为salaries没加锁
UNLOCK TABLES; ---一客户端
LOCK TABLE employees READ,salaries WRITE;
--一,二客户端都试
SELECT * FROM employees;
SELECT * FROM salaries;
---一客户端
UNLOCK TABLES;
独占写锁测试
独占写锁之并发插入数据:
并发插入(Concurrent Inserts):
上文提到过MyISAM表的读和写是串行的,但这是就总体而言的。在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
MyISACM存储引擎有一个系统变量concurrent_inserts,专门用以控制其并发插入的行为,其值分别为0,1或2.
1. 当concurrent_inserts设置为0(NEVER)时,不允许并发插入;
2.当concurrent_inserts设置为1(AUTO)时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。也就是MySQL的默认设置。
3. 当concurrent_inserts设置为2(ALWAYS)时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。
设置并发操作:
查看并发操作默认值 SHOW VARIABLES LIKE 'concurrent_insert'; 修改默认值为2: SET GLOBAL concurrent_insert=2;
设置并发插入格式:
LOCK TABLE tbl_name READ LOCAL;
-- 并发操作
---一客户端
SHOW VARIABLES LIKE 'concurrent_insert';
SET GLOBAL concurrent_insert=2; LOCK TABLE employees READ LOCAL;
INSERT INTO employees VALUES(1004,'1991-1-4','ty','io','M','2014-1-1');--插入不了
---二客户端
INSERT INTO employees VALUES(1004,'1991-1-4','ty','io','M','2014-1-1');--成功了
---一,二客户端
SELECT * FROM employees;--查询结果是不一样的 ---一,二客户端
UPDATE employees SET gender='F' WHERE emp_no=1001;--更新结果是不一样的,都不行
---一客户端
UNLOCK TABLES; ---一客户端
SET GLOBAL concurrent_insert=1; LOCK TABLE employees READ LOCAL; INSERT INTO employees VALUES(1009,'1991-1-4','ty','io','M','2014-1-1');--插入不了
---二客户端
INSERT INTO employees VALUES(1009,'1991-1-4','ty','io','M','2014-1-1');--成功了
并发操作测试
MyISAM锁调度:
思考:
一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁。MyISAM如何处理?
答案:
写进程先获得锁,即使读请求先到锁队列排队,写请求后到,写锁也会插入到读锁队列。MyISAM认为写请求比读请求更重要。MyISAM不太适合于有大量更新操作和查询操作的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。
解决方案:
执行SET LOW_PRIORITY_UPDATES =1;使该连接发出的更新请求优先级降低。
其中INSERT,DELETE也可以通过此方法指定。
MYSQL进阶学习笔记八:MySQL MyISAM的表锁!(视频序号:进阶_18-20)的更多相关文章
- MYSQL初级学习笔记五:连接查询!(视频序号:初级_37-41)
知识点七:连接查询(37-41) 什么是连接查询: 连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据.连接查询是同时查询两个或两个以上的表时使用的.当不同的表中存在相同意义的字段时 ...
- MYSQL初级学习笔记六:子查询!(视频序号:初级_42 | 43)
知识点八:子查询(42) 什么是子查询: 子查询是将一个查询语句嵌套在另一个查询语句中.内层查询语句的查询结果,可以作为外层查询语句提供条件. 引发子查询的情况: 使用[NOT] IN 的子查询 -- ...
- mysql的学习笔记(八)
1.存储引擎(表类型) mysql将数据以不同的技术存储在文件(内存)中,这种技术称为存储引擎.每一种存储引擎使用不同的存储机制,索引技巧,锁定水平,提供广泛且不同的功能. mysql支持的存储引擎 ...
- MYSQL初级学习笔记八:MySQL中常用的函数!(视频序号:初级_45-50)
知识点十:MySQL中的函数(45-50) 数学函数: 名称 描述 CEIL() 进一取整 FLOOR() 舍一取整 MOD 取余数(取摸) POWER() 幂运算 ROUND() 四舍五入 TRUN ...
- mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破
这一节课,沈老师带我们了解事务的异常 什么是异常? 我们先插入一组数据: ,10.5); 这个是正常的.但是我们把插入的user_money的值故意弄错:如下 ,‘abc’); 那么我们会得到一个ER ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 基于【 MySql 】二 || mysql详细学习笔记
mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...
- (1.3)学习笔记之mysql体系结构(C/S整体架构、内存结构、物理存储结构、逻辑结构)
目录 1.学习笔记之mysql体系结构(C/S架构) 2.mysql整体架构 3.存储引擎 4.sql语句处理--SQL层(内存层) 5.服务器内存结构 6.mysql如何使用磁盘空间 7.mysql ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- Iptables入门教程
转自:http://drops.wooyun.org/tips/1424 linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成. netfilter ...
- 【HDOJ5952】Counting Cliques(团,dfs)
题意:给定一张n点m边的图,求大小为S的团的个数 N ≤ 100,M ≤ 1000,2 ≤ S ≤ 10,保证点的度不超过20 思路:dfs 因为每个点可能不止属于一个极大团,所以不能求出极大团然后计 ...
- MySQL中blob 与 text
BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同. 有4种TEXT类型:TIN ...
- gdb 远程调试android进程
原文:http://blog.csdn.net/xinfuqizao/article/details/7955346?utm_source=tuicool 什么是gdb 它是gnu组织开发的一个强大的 ...
- 马蜂窝ABTest多层分流系统的设计与实现
什么是 ABTest 产品的改变不是由我们随便「拍脑袋」得出,而是需要由实际的数据驱动,让用户的反馈来指导我们如何更好地改善服务.正如马蜂窝 CEO 陈罡在接受专访时所说:「有些东西是需要 Sen ...
- 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)
在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...
- ubuntu下安装jdk、tomcat、mysql
1.JDK安装 方法1: 将JDK安装包解压缩之后,编辑~/.bashrc文件,在该文件里面加入下面的配置,然后通过source ~/.bashrc.JDK即安装成功. export JAVA_HOM ...
- windows symbol server调试
linux下gdb强大的调试功能让人印象深刻,一直以为windows下调试可执行程序非常让人头痛.经一些高人指点后知道原来windows下还有symbol server这种调试工具 参见下面两个文档 ...
- 解决树莓派8G的SD卡只能识别3.3G,SD卡扩容
8GB microSD在Windows下使用Win32 Disk Imager下载映像后,在RPi中只能识别出3.3GB.而本身还有很多容量没有释放出来. 使用sudo raspi-config工具可 ...
- MySQL 为日期增加一个时间间隔
set @dt = now(); select date_add(@dt, interval 1 day); - 加1天 select date_add(@dt, interval 1 hour) ...