mysql优化二之锁机制

摘要:
MySQL优化II锁机制MySQL提供了锁机制和MVCC机制,以确保并发操作的安全性。这里我们主要讨论锁定机制。有关MVCC,请参阅下一篇文章。MySQL锁根据锁粒度可以分为行锁和表锁。InnoDB存储引擎根据操作类型支持表锁和行锁。默认锁是行锁。MyIsam只支持锁粒度更高的表锁,并发性更好。表锁1.操作语法1 showopentables;检查数据库中哪些表已锁定。如果使用中为0,则表示未应用锁。2.锁定

mysql优化二之锁机制

mysql提供了锁机制和MVCC机制来保证并发操作的安全性,这里主要讨论锁机制,
MVCC见下篇文章

mysql的锁按照锁粒度可分为行锁与表锁,按照操作类型划分可读锁和写锁
InnoDB存储引擎支持表锁和行锁,默认锁为行锁,MyIsam只支持表锁
锁粒度越高则并发性越好

表锁

一、操作语法

1、 show open tables;查看数据库中哪些表加了锁

mysql优化二之锁机制第1张
in-use为0则表示未加锁

2、 lock table (table_name) read(write)

mysql优化二之锁机制第2张

mysql优化二之锁机制第3张

3、 unlock tables;解锁

二、示例

1、 读锁
开了两个mysql客户端,左边客户端中给mytest数据库中的test1表加了读锁

  • 左客户端执行读操作,右客户端执行读操作,可以看到两者都可以执行
    mysql优化二之锁机制第4张

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

mysql优化二之锁机制第5张

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

mysql优化二之锁机制第6张
左客户端拒绝执行

mysql优化二之锁机制第7张

右客户端阻塞住

此时我们解锁

mysql优化二之锁机制第8张

可以看到右客户端立即被释放并正确执行操作


2、 写锁
给左客户端test1表加上写锁

  • 左客户端读/写正常,右客户端读/写均被阻塞
    mysql优化二之锁机制第9张

  • 左客户端读/写该数据库中的其他表拒绝执行,右客户端可以正常执行
    mysql优化二之锁机制第10张


行锁

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

mysql优化二之锁机制第11张

  • 行级锁读操作两个客户端互不影响

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

mysql优化二之锁机制第12张


注意点

1、 间隙锁

mysql优化二之锁机制第13张

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

2、 索引失效

  • 当where查询条件没有索引时,行锁变表锁
    mysql优化二之锁机制第14张
    mysql优化二之锁机制第15张

  • 当where查询条件有索引但是索引失效时,行锁仍然变表锁
    mysql优化二之锁机制第16张

mysql优化二之锁机制第17张
当左客户端在已经减了索引的loc列用int型来查找时,索引失效就会导致整张表被锁住

行锁变表锁的原因:mysql的行锁是用索引实现的

3、 如何锁住一行

mysql优化二之锁机制第18张
在select语句找出某一行之后加一个for update

mysql优化二之锁机制第19张

免责声明:文章转载自《mysql优化二之锁机制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Git文件状态描述spring-cloud之服务治理组件Eureka下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL排序原理与MySQL5.6案例分析【转】

本文来自:http://www.cnblogs.com/cchust/p/5304594.html,其中对于自己觉得是重点的加了标记,方便自己查阅。更多详细的说明可以看沃趣科技的文章说明。 前言      排序是数据库中的一个基本功能,MySQL也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Gr...

浅谈SQL Server中的三种物理连接操作

本文转自:https://msdn.microsoft.com/zh-cn/library/dn144699.aspx 感觉写的很好,特此收录,以备自己和需要的朋友查看 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,M...

Windows下Mysql Cluster集群启动脚本与启动服务添加方法

3.2.8    集群启动脚本及启动服务注册 从上面的启动过程我们可以看出,Mysql集群启动命令较复杂,容易造成cmd窗口因误操作关闭而导致的数据库停止,在此我介绍一下如何将这些命令的操作变成windos的服务项,当windos启动时,便可以自动启动mysql集群。 首先,Mysql集群分为管理节点、数据节点、访问节点三种类型,每一种都可以注册为Win...

zabbix监控MySQL主从状态

首先需要拥有zabbix环境及MySQL主从环境   搭建zabbix环境可参考:https://www.cnblogs.com/l999999999/p/12051165.html 需要用到三台虚拟机 一:192.168.238.141 zabbix-server 二:192.168.238.142 zabbix-agent mysql主 三:192.1...

Mysql性能优化

mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升。 Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF) 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引] 分表技术(水平分割、垂直分割) 读写[写: update/d...

mysql表关联问题(第二卷:外键1对多之2)

接着上一卷内容我们继续: 上卷我用的查询语句我们可以看到全部数据,很明显这样的方式查找的数据并不详细: SELECT * FROM usr LEFT JOIN fzu ON usr.fzu = fzu.id WHERE fzu.fzu = 'A';我在之前语句的后面拼接了个where语句 看下结果: 多么完美的查询 现在悲催的是你的BOSS又加需求了,加...