MySQL中锁的类型
InnoDB存储引擎实现了一下两种标准的行级锁:
共享锁S LOCK 允许事务读一行数据 排他锁 X LOCK 允许事务删除或更新一行数据
如果是一个事务T1斤获得了行r的共享锁,那么另外一个事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,称这种情况为锁兼容Lock Compatible。但若有其他事务T3想获得行r的排他锁,则必须等待事务T1、T2释放行r的共享锁---这种情况称为锁不兼容

可以看到 X锁与任何锁都不兼容,而S锁仅和S锁金融。需要特别注意,S和X都是行锁,兼容是指通一行记录row锁的兼容情况
此外,InnoDB支持多粒度granular锁定。这种锁定允许事务在航级别上的锁和表级别上的锁同时存在。为了支持在不通粒度上进行加锁操作,InnoDB存储引擎支持一种额外的锁方式,称为意向锁(Intention Lock)。意向锁是将锁定的对象分为多个层次,意向锁意味着事务希望在更细粒度(fine granularity)上进行枷锁。

若将上锁的对象看成一棵树,那么对最上层的对象上锁,也就是对最细粒度的对象进行上锁,那么首先需要对粗粒度的对象上锁,如上图,如果需要对页上的记录r进行上X锁,那么分别需要对数据A、表、页上意向锁IX,最后对记录r上X锁,若其中任何一部分导致等待,那么该操作需要等待粗粒度锁的完成,举例来说,在对记录r及杀死那个X锁之前,已经有事务对表1进行了S表锁,那么表1已存在S锁,之后事务需要对记录r在表上系上IX,由于不兼容,那么该事物需要等待表锁操作的完成
InnoDB存储引擎支持意向锁设计比较简练,其意向锁即为表级别锁。设计目的主要是为了在一个事务上揭示下一个行将别请求的锁类型。其支持两种意向锁
意向共享锁 IS LOCK 事务想要获得一张表中某几行的共享锁 意向排他锁 IX LOCK 事务想要获得一张表中某几行的排他锁
由于InnoDB存储引擎支持的是行级别的锁,因此意向锁其实是不会阻塞出全表扫以外的任何请求

可以通过SHOW ENGINE INNODB STATUS来查看当前锁请求的信息

可以看到SQL语句 select * from t where a<4 lock in share mode在等待。RECODE LOCKS space id 30 page no 3 n bits 72 index 'PRIMARY' of table 'test'.'t' trx id 48B89BD lock_mode X locks rec but not gap 表示锁住的资源。locks rec but not gap代表锁住的是一个索引,而不是一个范围
在InnoDB 1.0 版本之前,用户只能通过SHOW FULL PROCESSLIST,SHOW ENGINE INNODB STATUS来查看当前数据库中锁的请求,然后在判断事物锁的情况,从InnoDB 1.0开始。在Information_schema架构下添加了表INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS。通过这三张表,用户可以更方便的监控到当前事务并发分析可能存在的锁问题。看一下INNODB_TRX结构


通过state可以观察到trx_id为730FEE的事务当前正在运行,而trx_id为731F4的事务处于LOCK WAIT状态,且运行的SQL语句是select * from parent lock in shar mode。该表只是显示了当前运行的innoDB事务,并不能准确的判断锁的一些情况。如果需要查看锁,还需要访问 INNODB_LOCKS

用户可以清楚的看到当前锁的信息,trx_id为730FEE的事务想表parent加了一个X的行锁。ID为7311F4的事务想表parent申请了一个S的行锁。lock_data都是1,申请相同的资源,因此会有等待。这样可以解析INNODB_TRX为什么一个事务的trx_state是RUNNING另一个是LOCK WAITLE
另外需要注意的是,发现lock_data并不是可信的值。例如当用户运行一个范围查找时,lock_data可能只返回第一行的主键值。与此同时,如果当前资源被锁住了。若锁住的页因为InnoDB存储引擎缓冲池的容量,导致页从缓冲池中被刷出,则查看INNODB_LOCKS表时,该值同样显示为NULL。即InnoDB存储引擎不会从磁盘进行再一次的查找
在通过INNODB_LOCKS馋看了每张表上锁的情况后,用户可以判断由此引发的等待情况。当事务较小时,用户就可以人为地、直观地进行判断了。但是当事务量非常大,其中锁和等待也时常发生。这个时候就不容易判断。但是可以通过INNODB_LOCK_WAITS可以很直观的反应出当前事务的等待。表INNODB_LOCK_WAITS由4个字段组成


通过上述的SQL语句,用户可以清楚的看到哪个事务阻塞了另一个事务。当然这只是给出了事务和锁ID,如果需要,用户可以根据表INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS得到更为直观的详细信息。例如,用户可以执行如下联合查询

MySQL中锁的类型的更多相关文章
- MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...
- Mysql中的一些类型
列类型--整数类型Tinyint:迷你整形 一个字节=8位 最大能表示的数值是0-255 实际区间 -128~127Smallint:小整形 两个字节 能表示0-65535Mediumint:中整型 ...
- 解析MySQL中存储时间日期类型的选择问题
解析MySQL中存储时间日期类型的选择问题_Mysql_脚本之家 https://www.jb51.net/article/125715.htm 一般应用中,我们用timestamp,datetime ...
- 关于MySql中的varchar类型
今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下. 1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的 ...
- mysql中的timestamp类型时间比较:unix_timestamp函数
在mysql中,某字段的类型设置为了timestamp,那么我们现在希望取出指定时间段的记录,该如何做呢? 在php中有time()和strtotime()来进行日期和时间戳的格式化,而在mysql中 ...
- MySql中的时间类型datetime,timestamp,date,year比较
MySQL日期类型.日期格式.存储空间.日期范围比较.日期类型 存储空间 日期格式 日期范围------------ --------- ...
- MySQL 中的数字类型
MySQL 中数据类型常用的就三大类: 数字类型/numeric types 日期和时间/date and time types 字符类型/string (character and byte) ty ...
- MySql中的varchar类型
转载:http://www.cnblogs.com/doit8791/archive/2012/05/28/2522556.html 1.varchar类型的变化 MySQL 数据库的varchar类 ...
- MySQL中的JSON类型
前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...
随机推荐
- 将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1
主要升级步骤如下: 将 .csproj 项目文件中的 target framework 改为 netcoreapp2.1 <TargetFramework>netcoreapp2.1< ...
- win10 环境下 MinGW-w64安装
MinGW-w64 就是 著名C/C++编译器GCC的Windows版本. 一.什么是 MinGW-w64 ?MinGW 的全称是:Minimalist GNU on Windows .它实际上是将经 ...
- JDK1.9环境变量配置
JAVA_HOME C:\Program Files\Java\jdk-9.0.1 JRE_HOME C:\Program Files\Java\jre-9.0.1 PATH .;%JAVA_HOME ...
- SVN Client API的.net 接口 SharpSvn介紹 Checkout操作实例
Subversion是一個文件版本管理工具, 廣泛的被大家採用來作為源代碼版本管理. 已有的工具不管是其自帶的命令行工具還是Windows UI的tortoiseSVN等還是很方便實用的, 但是如果想 ...
- Atitit.biz业务系统 面向框架 面向模式---------数据映射imp
Atitit.biz业务系统 面向框架 面向模式---------数据映射imp 1.1. 面向变量 面向过程 面向对象 面向组件 面向框架 面向服务 面向模式1 1.2. 第2章 架构模式 ...
- linux杂谈(十一):LDAPserver的搭建
1.LDAP简单介绍 今天我们来介绍LDAPserver的搭建和client的訪问,可是基本的问题在前者.首先我们要知道什么是LDAP. 在日常交谈中.你可能会听到有些人这么说:& ...
- c++ 请抛弃匈牙利命名法 - 变量命名代码风格的建议。
我只针对c++码农们讲,其他语言不了解不过应该大同小异.曾几何时翻开21天学通c++系列等脑残入门书,都以匈牙利命名法示人(DWORD dwXXX, int nXXX, string strXXX). ...
- 指尖上的电商---(11)Windows平台部署SolrCloud
SolrCloud是一种分布式解决方式,是基于zookeeper和solr的,能够简单理解为一种集群,能够提供分布式查询.分布式写索引. SolrCloud的结构大致是这种,一个SolrCloud包含 ...
- jq 获取select text
var Reply_type_name=$("#Reply_type").find("option:selected").text();
- Android之——JNI配置C语言打印Logcat信息
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47425073 这篇文章给大家介绍一下在JNI中怎样为C语言配置打印Logcat信息 ...