热门标签 | 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;(锁冲突和死锁是很难避免的)
 

推荐阅读
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
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社区 版权所有