mysql优化二之锁机制
mysql优化二之锁机制
mysql提供了锁机制和MVCC机制来保证并发操作的安全性,这里主要讨论锁机制,
MVCC见下篇文章
mysql的锁按照锁粒度可分为行锁与表锁,按照操作类型划分可读锁和写锁
InnoDB存储引擎支持表锁和行锁,默认锁为行锁,MyIsam只支持表锁
锁粒度越高则并发性越好
表锁
一、操作语法
1、 show open tables;查看数据库中哪些表加了锁

in-use为0则表示未加锁
2、 lock table (table_name) read(write)


3、 unlock tables;解锁
二、示例
1、 读锁
开了两个mysql客户端,左边客户端中给mytest数据库中的test1表加了读锁
左客户端执行读操作,右客户端执行读操作,可以看到两者都可以执行

对于同一数据库中的其他表操作,左客户端拒绝执行,右客户端可以执行

- 对于被锁住的表执行写操作

左客户端拒绝执行

右客户端阻塞住
此时我们解锁

可以看到右客户端立即被释放并正确执行操作
2、 写锁
给左客户端test1表加上写锁
左客户端读/写正常,右客户端读/写均被阻塞

左客户端读/写该数据库中的其他表拒绝执行,右客户端可以正常执行

行锁
因为mysql默认的存储引擎是InnoDB,而InnoDB默认为行锁,我们要测试行锁首先需要把mysql的自动提交关闭

行级锁读操作两个客户端互不影响
写操作如果操作的不是同一行,也不影响,若操作的是同一行则后一个客户端的请求被阻塞,直到前一个客户端的请求提交

注意点
1、 间隙锁

我们在左边客户端对id在(0,5]范围内的数据做写操作,但是由于数据表中没有id为4的数据行,按理说右边数据库插入一个id为4的数据行不会被锁住,但是事实表明它被锁住了。这既是mysql的间隙锁机制。因此我们在数据库操作时其实应该避免这种间隙的产生,我们可以在表里设置一个状态位,当要删除某一数据行时,可以选择将该状态位设置为无效而不是真正的删除。
2、 索引失效
当where查询条件没有索引时,行锁变表锁


当where查询条件有索引但是索引失效时,行锁仍然变表锁


当左客户端在已经减了索引的loc列用int型来查找时,索引失效就会导致整张表被锁住
行锁变表锁的原因:mysql的行锁是用索引实现的
3、 如何锁住一行

在select语句找出某一行之后加一个for update

mysql优化二之锁机制的更多相关文章
- MySQL优化二(连接优化和缓存优化)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- Mysql存储引擎以及锁机制
一.常用命令 1.查看引擎(默认为InnoDB) 查看mysql提供的存储引擎:show engienes 查看mysql当前默认的存储引擎:show variables like '%storage ...
- 安卓电量优化之WakeLock锁机制全面解析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.WakeLock概述 wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态.比如,手机屏幕在屏幕关闭 ...
- MySQL常用引擎的锁机制
一.引言 ...
- MySQL的几种锁机制的使用介绍
锁 在日常的开发过程中,为了控制线程的并发肯定会用到锁机制.对于数据库而言,锁机制就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.当然MySQL也不例外,根据不同 ...
- MySQL优化(二):SQL优化
一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...
- MySQL优化二 缓存参数优化
数据库属于 IO密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数 ...
- mysql 优化之 doublewrite buffer 机制
是什么? doublewrite buffer是mysql 系统表空间的一块存储区域. 有什么用? 在Innodb将数据页写到数据存储文件之前,存储从Innodb缓存池刷过来的数据页.且只有将数写入d ...
- MySQL 优化 (二)
参数优化 Max_connections (1)简介 Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,如果连接数越来越多,mysql会为每个连接提供单独的缓冲区,就会开销的越多的 ...
随机推荐
- JS 总结
加var与不加var的区别: 简单来说就是加了var是局部变量 不加是全局变量.只有加了var的情况下就能限定该变量的使用范围 这样在别的方法里面也可以命名同样的变量了
- javascript系列1--把字符串当代码来执行
转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html 请尊重笔者的劳动成果 --John Hou 在javascript中有多种方法可以 ...
- Windows平台软件推荐:神器小工具(骨灰级)
底层工具 "If you know how to use Process Monitor competently, people of both sexes will immediately ...
- Guava新增集合类型-Multimap
Guava新增集合类型-Multimap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比 ...
- 使用limit查询的同时取得总的记录数:SQL_CALC_FOUND_ROWS和FOUND_ROWS()
通常我们都用如下的sql来进行列表 SELECT COUNT(*) FROM users WHERE name LIKE 'a%';SELECT name, email FROM users WHER ...
- CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲
CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲 都是图.. 不足之处,欢迎补充
- Android--性能测试关注的指标
性能测试过程中,出现的一些问题可直接导致了用户对当前app的使用率和卸载率,如果app使用时卡顿严重或者加载页面慢,cpu占用率高,导致app闪退等问题,在测试过程中,则需特别关注性能方面的体验,ap ...
- Chapter1:基础
整本书的核心:语言的设计与实现 我们所看到的设计是显示的,语法定义的, 而实现是隐式的,决定了编译或运行时的行为. 了解设计的目的,可以推测实现的细节,也可以自己实现设计. 学习具体的实现,更充分的达 ...
- Vue.js-10:第十章 - 组件间的数据通信
一.前言 在上一章的学习中,我们继续学习了 Vue 中组件的相关知识,了解了在 Vue 中如何使用组件的 data.prop 选项.在之前的学习中有提到过,组件是 Vue 中的一个非常重要的概念,我们 ...
- react源码总览(翻译)
用react也有段时间了, 是时候看看人家源码了. 看源码之前看到官方文档 有这么篇文章介绍其代码结构了, 为了看源码能顺利些, 遂决定将其翻译来看看, 小弟英语也是半瓢水, 好多单词得查词典, 不当 ...