热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL锁--(深入浅出读书笔记)

MySQL锁的概述1.针对不同的引擎,采用不同的锁机制;(表锁,页面锁,行锁)myisam和memory存储引擎:表级锁;BOB存储引擎:页面锁,表级
===MySQL锁的概述===
1.针对不同的引擎,采用不同的锁机制;(表锁,页面锁,行锁)
myisam和memory存储引擎: 表级锁;
BOB存储引擎: 页面锁,表级锁;
innodb存储引擎:行级锁(默认),表级锁;
 
2.三种锁的特性:
开销、加锁速度、死锁、粒度、并发性能
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 (更适用于查询为主,少量的按照索引条件更新的,如Web应用;行级锁更适合含有大量按照索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线失误处理OLTP)
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
 
3.mysql行锁模式
共享锁S:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁;
排他锁X:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
 

===实际操作中的问题===
 场景:一张千万级大表table_A(若数据量过少,很难观察到具体的现象)

 相关现象:

SELECT * FROM information_schema.`PROCESSLIST` WHERE info IS NOT NULL and db = 'DB_A' ORDER BY TIME DESC;

  查询当前的process,可以发现如下截图中state

   根据以上截图可以发现:在执行alter table_A (管理端)和select table_A(客户端的一条慢sql)这两条sql的时候,alter的状态是wating for table metadata lock。

从时间上判断可知,select 是客户端发起的一个慢sql,分析该sql发现缺少索引index,于是给该表添加索引执行alter 。

1 相关解释:
2 
3  alter 语句的状态是wating for table metadata lock。
4   select 语句是首先获取到共享锁,与其他select语句并无冲突。但是共享锁跟排他锁互斥的, alter语句需要获取到排他锁,也就是表锁,那么需要先等待select结束

解决方案:

   未避免alter 语句在执行过程中需要等待select语句从而获得排他锁,那么在执行alter table等DDL语句的时候(definition),需要先将对该表的其他查询kill掉。
补充:

1 意向锁:意向共享锁和意向排他锁,这两种都是表锁;
2 事务在对  进行共享锁的时候,需要先对 进行意向共享锁;
3 同理意向排他锁。

 

4.innodb行锁的实现方式===
innodb行锁是通过给索引加锁实现的;注意: 若是innodb不通过索引条件查询时,则会锁表。分3种情形
record lock:对索引加锁;
gap lock :索引项之间的间隙(first之前,或者last最后);
next-key lock :对记录和间隙加锁;
==案例
1 insert into tab1 select * from tab2 where ~;
2 create table  tab1 select * from tab2 where ~;
这两个操作需要给tab2加锁,否则在binlog的记录,利用他进行数据库恢复或者主从,则会导致数据不一致;
在rds实际操作中,执行以上两个操作的同时,对tb2执行alter table等DDL语句,则会导致DDL状态为wating for metadata table lock ;而若是对tb2执行insert等DML语句,当两个事务都commit之后,tb1中的数据是未执行DML操作的tb2那一时刻的数据;这个并不涉及到锁,但是和隔离级别以及redo undo有一定的关系。
 
5.死锁deadlock
myisam是不会出现死锁的,因为它会一次性获取全部锁。
innodb有个自动检测死锁的机制,参数 innodb_lock_wait_timeout可以帮助解决死锁和并发高引起的锁问题。参数在rds上默认设置为50s;(锁冲突和死锁是很难避免的)
 

推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
author-avatar
赵博钧石博
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有