热门标签 | 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 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文探讨了如何在发布 XenApp 应用时,通过命令行参数实现启动时的参数传递。特别介绍了静态和动态参数传递的方法,并详细解释了 ICA 文件中两种参数传递方式的区别及安全检查机制。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何在QT框架中使用QWebSocket和QTcpSocket实现SSL加密通信,涵盖单向认证设置。单向认证常见于Web通信场景,其中客户端验证服务端证书,而服务端不验证客户端证书。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
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社区 版权所有