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优化二之锁机制的更多相关文章

  1. MySQL优化二(连接优化和缓存优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  2. Mysql存储引擎以及锁机制

    一.常用命令 1.查看引擎(默认为InnoDB) 查看mysql提供的存储引擎:show engienes 查看mysql当前默认的存储引擎:show variables like '%storage ...

  3. 安卓电量优化之WakeLock锁机制全面解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.WakeLock概述 wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态.比如,手机屏幕在屏幕关闭 ...

  4. MySQL常用引擎的锁机制

    一.引言                                                                                                 ...

  5. MySQL的几种锁机制的使用介绍

    锁 在日常的开发过程中,为了控制线程的并发肯定会用到锁机制.对于数据库而言,锁机制就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.当然MySQL也不例外,根据不同 ...

  6. MySQL优化(二):SQL优化

    一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...

  7. MySQL优化二 缓存参数优化

    数据库属于 IO密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数 ...

  8. mysql 优化之 doublewrite buffer 机制

    是什么? doublewrite buffer是mysql 系统表空间的一块存储区域. 有什么用? 在Innodb将数据页写到数据存储文件之前,存储从Innodb缓存池刷过来的数据页.且只有将数写入d ...

  9. MySQL 优化 (二)

    参数优化 Max_connections (1)简介 Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,如果连接数越来越多,mysql会为每个连接提供单独的缓冲区,就会开销的越多的 ...

随机推荐

  1. 学会这15点,让你分分钟拿下Redis数据库

    1.Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI ...

  2. Python简介之输入和输出

    输出 输入 输出 用print()在括号中加上字符串就可以向屏幕上输出指定的文字.比如输出'hello,world!',用代码实现如下:print('hello world!'). print()函数 ...

  3. Python常用算法(二)

    1.快速排序 过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小 一般选取第一个数作为关键数据k,我们要把比k小的所有数据移到它的左面,从后往前找第一个比它 ...

  4. bzoj5342 CTSC2018 Day1T3 青蕈领主

    首先显然的是,题中所给出的n个区间要么互相包含,要么相离,否则一定不合法. 然后我们可以对于直接包含的关系建出一棵树,于是现在的问题就是给n个节点分配权值,使其去掉最后一个点后不存在非平凡(长度大于1 ...

  5. Postman----基础使用篇(没有接口文档的情况下如何着手做接口测试)

    [备注说明]内文中的图片由于页面的限制,图片显示不清晰,为了能更加的看清图片,请点击"图片",点击"右键"选择"在新标签页中打开图片",可查 ...

  6. Hadoop配置第1节-集群网络配置

    Hadoop-集群网络配置 总体目标:完成zookeeper+Hadoop+Hbase 整合平台搭建   进度:1:集群网络属性配置2:集群免密码登陆配置3:JDK的安装4:Zookeeper的安装5 ...

  7. Extjs中数据导出到Excel

    1.前端代码(URL+前端传入参数) window.location.href="studnetMaintainAction!exportExcel"               ...

  8. 【机器学习基础】对 softmax 和 cross-entropy 求导

    目录 符号定义 对 softmax 求导 对 cross-entropy 求导 对 softmax 和 cross-entropy 一起求导 References 在论文中看到对 softmax 和 ...

  9. kubernetes进阶之四:Label和Label Selector

    一:什么是Label Label是Kubernetes系列中另外一个核心概念.是一组绑定到K8s资源对象上的key/value对.同一个对象的labels属性的key必须唯一.label可以附加到各种 ...

  10. MIP 脚本域名地址变更公告

    尊敬的 MIP 开发者: MIP 团队为了解决 MIP-Cache 页面下 cookie 相互覆盖问题,增强站点品牌露出,在 2017 年 8 月将 MIP 的脚本域名和 MIP-Cache 页面域名 ...