(1.15)mysql锁问题之InnoDB锁
关键词:innodb锁,mysql锁
概要:
1、事务的隔离级别
2、InnoDB锁争用
3、innodb锁
【3.1】innodb的行锁模式及加锁方法
其实,默认情况下,mysql 的 select 查询是不会加任何锁的,其他的CDU,都会先IX,再加上X锁
【3.2】innodb行锁实现方式
mysql的行锁是针对索引来加锁的~!
(1)在不通过索引条件查询时,走全表扫了,则innodb会锁定表中的所有记录
(2)mysql是通过索引加锁的,不是针对记录,如果索引值相同有多条记录,那么会被一并锁住。
(3)当表有多个索引的时候,不同的事务可以通过不同索引锁定不同的行,无论是使用主键索引、唯一索引或普通索引,innodb都会使用行锁对数据加锁。
(4)即使在条件中加了索引,但如果执行计划没有走索引,走的是全表扫,还是会全部上锁。
4、锁与恢复、复制的关系(基于binlog)
【4.1】binlog的恢复复制模式
【4.2】在做create table tab1 select * from source_tab 与 insert into tab1 select ...from source_tab时 会加共享锁。
如果有范围性判断,该select操作还会加netx-key锁,以便保证数据恢复和复制的正确性
【4.3】innodb_locks_unsafe_for_binlog 设置为on(默认off) 导致主从不一致
innodb_locks_unsafe_for_binlog 设置为on 之后,【4.2】中事务图就不会加共享锁。但因为binlog是串行执行,可能会导致主从不一致。
【4.4】不同隔离级别下的锁
加共享锁: select ........for update
加排它锁: select ........LOCK IN SHARE MODE
5、什么时候使用表锁
6、MyISAM与innodb锁总结
详细内容:
1、事务的隔离级别

2、InnoDB锁争用
【2.1】行锁查看:show status like 'innodb_row_lock'

如果锁争用比较高,比如 Innodb_row_lock_time 与 Innodb_row_lock_time_avg 比较高,可以查看【2.2】
【2.2】查看当前锁情况:select * from information_schema.innodb_locks \G
查看当前锁等待情况:select * from information_schema.innodb_lock_waits \G
【2.3】使用innodb_monitors来查看innodb情况
show engine innodb status \G

3、innodb锁
【3.1】innodb的行锁模式及加锁方法
其实,默认情况下,mysql 的 select 查询是不会加任何锁的,其他的CDU,都会先IX,再加上X锁


【3.2】innodb行锁实现方式
mysql的行锁是针对索引来加锁的~!

(1)在不通过索引条件查询时,走全表扫了,则innodb会锁定表中的所有记录

(2)mysql是通过索引加锁的,不是针对记录,如果索引值相同有多条记录,那么会被一并锁住。
比如id列有索引,name列没有索引。

(3)当表有多个索引的时候,不同的事务可以通过不同索引锁定不同的行,无论是使用主键索引、唯一索引或普通索引,innodb都会使用行锁对数据加锁。
(4)即使在条件中加了索引,但如果执行计划没有走索引,走的是全表扫,还是会全部上锁。
【3.3】next-key锁



4、锁与恢复、复制的关系(基于binlog)
【4.1】binlog的恢复复制模式

【4.2】在做create table tab1 select * from source_tab 与 insert into tab1 select ...from source_tab时 会加共享锁。
如果有范围性判断,该select操作还会加netx-key锁,以便保证数据恢复和复制的正确性


【4.3】innodb_locks_unsafe_for_binlog 设置为on(默认off) 导致主从不一致
innodb_locks_unsafe_for_binlog 设置为on 之后,【4.2】中事务图就不会加共享锁。
那么;
假如 session2先提交(也就是update先提交),session1后提交(也就是插入操作后提交)。
主库不会受到影响,但是从库会有影响,具体如下:
binlog是串行化执行的,谁先提交先执行谁。本来是要插入1的,因为并行update事务先提交,索引会先update,再插入,就导致主从数据不一致。最后插入的数据变成8了。
【4.4】innodb存储引擎中不同SQL在不同隔离级别下锁比较

5、什么时候使用表锁

6、MyISAM与innodb锁总结


(1.15)mysql锁问题之InnoDB锁的更多相关文章
- MySQL锁:02.InnoDB锁
目录 InnoDB锁 InnoDB行锁实现机制 InnoDB隐式.显式锁 InnoDB锁类型 共享锁 排他锁 意向锁 InnoDB锁兼容性 InnoDB行锁范围.粒度 InnoDB行锁粒度一览 意向插 ...
- Mysql技术内幕之InnoDB锁探究
自7月份换工作以来,期间一直在学习MySQL的相关知识,听了一些视频课,但是一直好奇那些讲师的知识是从哪里学习的.于是想着从书籍中找答案.毕竟一直 看视频也不是办法,不能形成自己的知识.于是想着看书汲 ...
- MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题
我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...
- [转]关于MYSQL Innodb 锁行还是锁表
关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 目时由于业务逻辑的需要,必须对数 ...
- MySQL- InnoDB锁机制
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
- MySQL锁和事务(一):InnoDB锁(MySQL 官方文档粗翻)
// 写在前面,实际上,数据库加锁的类型和范围受到多种因素的影响,例如数据库隔离等级,SQL语句,是否使用主键.索引等等.可以查看博文: http://www.cnblogs.com/zhaoyl/p ...
- MySQL锁:03.InnoDB行锁
目录 InnoDB 行锁 锁排查可以用的视图和数据字典 InnoDB 行锁兼容性 InnoDB行锁之共享锁 共享锁: 查看InnoDB锁 InnoDB行锁实现机制 对普通索引上锁 InnoDB隐式.显 ...
- MySQL数据恢复和复制对InnoDB锁机制的影响
MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...
- mysql innodb锁简析(2)
继续昨天的innodb锁的分析: 注:此博文参考一下地址,那里讲的也很详细.http://xm-king.iteye.com/blog/770721 mysql事务的隔离级别分为四种,隔离级别越高,数 ...
随机推荐
- Angular4学习笔记(九)- 生命周期钩子简介
简介 Angular 指令的生命周期,它是用来记录指令从创建.应用及销毁的过程.Angular 提供了一系列与指令生命周期相关的钩子,便于我们监控指令生命周期的变化,并执行相关的操作.Angular ...
- mysql 分组查询的结果当成临时表 在求最大值
select avg(data1) as a from temp WHERE YEAR(mdate)= 2018 and MONTH(mdate)=03 and day(mdate)=25 GROUP ...
- 服务器最大TCP连接数及调优汇总
启动线程数: 启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数 最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比.如果任务都是CPU计算型任务,那么线程数最多不超过 ...
- ABBYY FineReader Pro for Mac有哪些特性(上)
使用ABBYY FineReader Pro for Mac轻松转换纸质文档.PDF文件和数字文本照片为可编辑和可搜索的文件,再也不需要手动重新输入或格式化了,相反,可以编辑.搜索.共享.归档和复制文 ...
- Tomcat -- 启动错误 -- 解决锦集
java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter :在Tomacat7的context.xml文 ...
- VS2017 配置ImageMagick
以下配置仅供参考,我配置完了怎样都用不了... 直接下载源码使用VS进行编译. 源码下载地址:http://imagemagick.org/script/install-source.php#wind ...
- Android studio启动后卡在refreshing gradle project
这个问题几乎每个刚使用Android studio的同学都会碰到过,网上有各式各样的方法,有的说使用本地gradle,我试过多次,每次启动Android studio时还是会检查更新,所以根本上解决的 ...
- C# 读写Excel的一些方法,Aspose.Cells.dll
需求:现有2个Excel,一个7000,一个20W,7000在20W是完全存在的.现要分离20W的,拆分成19W3和7000. 条件:两个Excel都有“登录名”,然后用“登录名”去关联2个Excel ...
- Xshell登录Ubuntu12.04
Ubuntu安装ssh服务: sudo apt-get install openssh-server 打开Xshell,选择“新建”,“连接”设置里选择SSH,主机填入需要连接的主机的IP地址.在“用 ...
- C# MVC+EF—WebApi
上一篇搭建了页面,这里写下功能. 这里我用WebApi实现数据的增删改查. 一.新建Controller 为了区分明确,我在Controller文件夹下建立一个WebApi文件夹存放. 选中文件夹右键 ...