我们知道 mysql innodb 在插入更新数据时是锁行的,但这里所指的行并不是直面上说的单行,而是相对的范围的行!

引起我关注这个问题的是在做天气预报查询15天(http://tqybw.net)这个项目时发现的!其中有一张表开始用的是MyISAM类型的,由于更新很频繁,经常会造成表锁,改成innodb后,虽然表锁的机率小了很多,但还是会发生!
以下是分析测试:
表结构如下 
Sql代码  
CREATE TABLE `tianqi` (  
`id` int(11) NOT NULL AUTO_INCREMENT,  
`a` int(11) NOT NULL,  
`b` int(11) NOT NULL,  
PRIMARY KEY (`id`),  
KEY `index_a` (`a`)  
) ENGINE=InnoDB  
现在只在列a上有索引 
在两个客户端分别执行 
Sql代码  
update tianqi set b=4 where a=1 and b=3;  
Sql代码  
update tianqi set b=2 where a=1 and b=1;  
第二个会等待超时 
[Err] 1205 - Lock wait timeout exceeded; try restarting transaction 
原来InnoDB不是只在最终要更新的行上加锁,而是在被扫描过的所有行上加锁.也就是说, 
如果执行update tianqi set b=2 where b=1;其实表里所有的行都被加锁了. 
官方文档说明如下 
A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scanned in the processing of the SQL statement. It does not matter whether there are WHERE conditions in the statement that would exclude the row. InnoDB does not remember the exact WHERE condition, but only knows which index ranges were scanned.
所以mysql innodb 所谓的行锁是在受影响条件范围内的数据的行锁!
如果是表的主键条件更新,影响一行,才真正的单行锁!

转载于:https://blog.51cto.com/mumayi/1028228

mysql InnoDB 行锁分析相关推荐

  1. MySQL · 引擎分析 · InnoDB行锁分析

    前言 理解InnoDB行锁,分析一条SQL语句会加什么样的行锁,会锁住哪些数据范围对业务SQL设计和分析线上死锁问题都会有很大帮助.对于InnoDB的行锁,已经有多篇月报进行了介绍,这里笔者借鉴前面月 ...

  2. mysql隐式锁定辅助索引_当Mysql - InnoDB行锁遇到复合主键和多列索引-Go语言中文社区...

    背景 今天在配合其他项目组做系统压测,过程中出现了偶发的死锁问题.分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了 ...

  3. mysql innodb 全表锁,Mysql InnoDB行锁及表锁分享

    一. 背景知识 二. 步入正题:表锁和行锁 1.1. 表锁 vs 行锁 在 MySQL 中锁的种类有很多,但是最基本的还是表锁和行锁:表锁指的是对一整张表加锁,一般是 DDL 处理时使用,也可以自己在 ...

  4. MySQL InnoDB update锁表问题Record Locks

    最近做的项目中出现了锁表的问题,导致表无法进行事务(DML)操作,经过排查发现,我们项目中的购物车表有个字段cart_id为uuid类型,并且未设置索引,这里的场景是根据cart_id进行更新内容,M ...

  5. MySQL高级 - 锁 - InnoDB行锁 - 争用情况查看

    InnoDB 行锁争用情况 show status like 'innodb_row_lock%'; Innodb_row_lock_current_waits: 当前正在等待锁定的数量Innodb_ ...

  6. MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

    MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁 ...

  7. MySQL InnoDB引擎锁的总结

    为什么要锁 我们开的的各式各样系统中,系统运行需要CPU.内存.I/O.磁盘等等资源.但除了硬资源外,还有最为重要的软资源:数据. 当人们访问操作我们的系统时,其实归根是对数据的查看与生产.那么对于同 ...

  8. 9、 InnoDB行锁

    在 MySQL 中,InnoDB 行锁通过给索引上的索引项加锁来实现,如果没有索引,InnoDB 将通过隐藏的聚簇索引来对记录加锁. InnoDB 支持 3 种行锁定方式: 行锁(Record Loc ...

  9. mysql innodb 的锁机制_Mysql之Innodb锁机制详解

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.关于事务我们之前有专题介绍,这里就着重介绍下它的锁机制. 总的来说,InnoDB按照不同的分类共有 ...

最新文章

  1. idea上实现github代码同步
  2. JavaScript中几个重要的知识点(1) ---- 面向对象
  3. 阿里巴巴总裁马云对雅虎员工的精彩演讲:爱迪生欺骗了世界!(转载)
  4. 445port入侵具体解释
  5. python输入逗号分隔值文件_如何在Python(Pygame)中显示逗号分隔值(.txt)文件中的前10个高分...
  6. python笔记之function函数
  7. PWA(Progressive Web App)入门系列:(五)Web Worker
  8. 四年从P7到P9,这个阿里小二的秘诀是给自己挖坑
  9. oracle统计学生成绩c,Oracle11g学生成绩管理系统.docx
  10. Oracle导入程序Imp的使用详解
  11. 高德地图上线高考出行专项服务
  12. oracle 字段和当前时间比较,请教如何按照当前时间与数据库表中的字段时间比较提取记录,涉及跨天...
  13. rdkit 修改分子
  14. YYKit-YYDispatchQueuePool分析
  15. H3CIERS+(H3C认证路由交换互联网专家介绍)
  16. 怎样利用计算机随机分组,随机分组编制方法哪家强
  17. 使用万用表来进行简易的运放芯片配对
  18. 基于SSM的志愿者管理系统
  19. (八) 爬虫教程 |Scrapy框架的使用
  20. NICE的Verilog代码

热门文章

  1. js获取css文件中的样式
  2. ADO.NET连接Access数据库实例
  3. python大神读取_大神教你python 读取文件并把矩阵转成numpy的两种方法
  4. 怎么根据输入的n来输入n组数组_【题解一维数组】1106:年龄与疾病
  5. cts测试终于全测了一遍了
  6. 《记》rxjs分流操作符简单实现
  7. 软路由OpenWrt教程收集(插件开发教程,opkg安装软件教程)
  8. sysv-rc-conf管理Ubuntu server开机启动服务
  9. git回滚到之前代码
  10. 自定义video控制栏,移动端可行