MySQL锁学习之UPDATE
##==============================================================================##
学MySQL也蛮长时间了,可一直停留在能干活但是不精通的状态,而且很多MySQL知识点受SQL Server的影响存在理解偏差,只能且行且努力吧!
因为不懂源码,而MySQL也没提供很好的视图来验证以下观点,因此只能说说测试过程和实验结果,请各位报怀疑眼光阅读
##==============================================================================##
问题点:
当MySQL做UPDATE操作时,会如何加锁?
测试方法:
通过两个会话执行SQL是否有阻塞来推测。
测试环境:
MySQL:5.5.14-log Source distribution
测试表:
CREATE TABLE "t_test1" (
"id" int(11) NOT NULL AUTO_INCREMENT,
"c1" int(11) DEFAULT NULL,
"c2" int(11) DEFAULT NULL,
"c3" int(11) DEFAULT NULL,
"c4" int(11) DEFAULT NULL,
PRIMARY KEY ("id"),
KEY "idx_c1_c2" ("c1","c2"),
KEY "idx_c3" ("c3")
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8
当前表数据:

##==============================================================================##
测试1:
回话1执行SQL但不提交:insert into t_test1(c1,c2,c3,c4)select 1,1,1,1;
回话2执行SQL:insert into t_test1(c1,c2,c3,c4)select 1,1,1,1;
实验结果:回话2能正常执行,无阻塞。
##==============================================================================##
测试2:
回话1执行SQL但不提交:update t_test1 set c4=1 where id=8;
回话2执行SQL:update t_test1 set c4=1 where id=9;
实验结果:回话2能正常执行,无阻塞。虽然记录ID为8和9的C1和C2的数据相同且C1和C2上有索引。
##==============================================================================##
回话1执行SQL但不提交:update t_test1 set c4=0 where c1=1 and c2=1;
回话2执行SQL:update t_test1 set c4=0 where c1=1 and c2=1;
实验结果:回话2不能正常执行,被阻塞。
由于回话1和回话2要更新相同的记录,肯定存在锁问题,被阻塞完全可以理解。
##==============================================================================##
测试4:
回话1执行SQL但不提交:update t_test1 set c4=0 where c1=1 and c2=1 and c4=8;
回话2执行SQL:update t_test1 set c4=0 where c1=1 and c2=1 and c4=9;
实验结果:回话2不能正常执行,被阻塞。
猜测:由于索引idx_c1_c2(c1,c2)的存在,回话1先按照条件c1=1 and c2=1在索引idx_c1_c2上找到“第一次匹配”的记录,然后加锁,再根据条件C4=8找到“最终匹配”记录,最后更新该记录,但由于“第一次匹配”时加锁导致回话2被阻塞
##==============================================================================##
测试5:
回话1执行SQL但不提交:update t_test1 set c4=0 where c1=1 and c2=1 and id=8;
回话2执行SQL:update t_test1 set c4=0 where c1=1 and c2=1 and id=9;
实验结果:回话2能正常执行,无阻塞。
由于ID为唯一主键,即使回话1和回话2的WHERE条件中包含c1=1 and c2=1条件,仍不会造成阻塞。
##==============================================================================##
测试6-1:
回话1执行SQL但不提交:update t_test1 force index(idx_c1_c2) set c4=1 where c1=1 and c2=2 and c3=8;
回话2执行SQL:update t_test1 force index(idx_c1_c2) set c4=1 where c1=1 and c2=2 and c3=9;
实验结果:回话2不能正常执行,被阻塞。
因为强制使用idx_c1_c2,先按照条件c1=1 and c2=1在索引idx_c1_c2上加锁,导致回话2被阻塞
##==============================================================================##
测试6-2:
回话1执行SQL但不提交:update t_test1 force index(idx_c3) set c4=1 where c1=1 and c2=2 and c3=8;
回话2执行SQL:update t_test1 force index(idx_c3) set c4=1 where c1=1 and c2=2 and c3=9;
实验结果:回话2能正常执行,无阻塞。
因为强制使用idx_c3,先按照C3=8和C3=9两个条件在idx_c3上加锁,所以回话2没有被回话1阻塞
##==============================================================================##
打完收工

MySQL锁学习之UPDATE的更多相关文章
- mysql锁SELECT FOR UPDATE【转】
MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE ...
- Mysql 锁表 for update (引擎/事务)
因为之前用过oracle,知道利用select * for update 可以锁表.所以很自然就想到在mysql中能不能适应for update来锁表呢. 学习参考如下 由于InnoDB预设是Row- ...
- 对mysql锁机制的学习
1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...
- 【MySQL】MySQL悲观锁 + 事物 + for update 解决普通流量并发的问题
使用mysql悲观锁解决并发问题 最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事 ...
- MySQL中select * for update锁表的范围
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- MySQL中select * for update锁表的问题
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- mysql 通过测试'for update',深入了解行锁、表锁、索引
mysql 通过测试'for update',深入了解行锁.表锁.索引 条件 FOR UPDATE 仅适用于InnoDB存储引擎,且必须在事务区块(BEGIN/COMMIT)中才能生效. mysql默 ...
- MYSQL进阶学习笔记八:MySQL MyISAM的表锁!(视频序号:进阶_18-20)
知识点九:MySQL MyISAM表锁(共享读锁)(18) 为什么会有锁: 打个比方,我们到淘宝买一件商品,商品只有一件库存,这时候如果还有另外一个人也在买,那么如何解决是你买到还是另一个人买到的问题 ...
- MySQL学习(三)MySQL锁与事务
本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. 一.MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支 ...
随机推荐
- Elixir游戏服设计一
在Erlang游戏服设计总结http://www.cnblogs.com/rubyist/p/5530575.html里, 我提到我想要的游戏服设计方法,希望以应用做为基础构建块.最近我在学习elix ...
- 学习如何看懂SQL Server执行计划(三)——连接查询篇
三.连接查询部分 --------------------嵌套循环-------------------- /* UserInfo表数据少.Coupon表数据多嵌套循环可以理解为就是两层For循环,外 ...
- mysql慢查询分析工具 mysqlsla 安装
概述 mysqlsla 是一款很不错的mysql慢查询日志分析工具,而且简单易用.mysqlsla 是用perl编写的脚本,运行需要perl-DBI和per-DBD-Mysql两模块的支持.mysql ...
- 虚拟机+桥接模式+Host-only模式 搭建完美的Windows下Linux开发环境
相信有很多鞋童和我一个样是一枚Linux码农(我现在还是嵌入式方向). 做Linux开发势必需要一个Linux环境, 大多数开发者会首先选择一个Linux发行版, 其中Ubuntu LTS版本应该是选 ...
- SqlServer和Oracle中一些常用的sql语句5 流程控制语句
--在sql语句中 begin...end 用来设定一个程序块 相关于c#中的{} declare @yz real,@w int --声明变量 set @w=120 --为变量赋值 if @w< ...
- Win10系统下安装Ubuntu16.04.3教程与设置
在Win10上刚刚装好Ubuntu16.04.3,装了不下于10次,期间出现很多问题,趁着还有记忆,写下这篇教程,里面还有Ubuntu系统的优化与Win10的一些设置. Part 1 制作Ubuntu ...
- 工信部:我国4G用户近9.5亿 用户平均使用流量近2G
刚刚沿着广场转了一圈,我竟发现自己离他只有几步之遥,又在那条人行道上,刚才催促我前进的自豪感突然之间被惊慌代替.陌生人看着我,脸上流露出一种遗憾的表情,他向我靠近,轻轻摇着脑袋,像是为某个不受人控制的 ...
- WordCount项目
采用的源码来自http://blog.csdn.net/lnz001/article/details/54851551 经修改后,已上传至GitHub.https://github.com/FengX ...
- angular.js基础
内置指令 所有的内置指令的前缀都为ng,不建议自定义指令使用该前缀,以免冲突.首先从一些常见的内置指令开始.先列出一些关键的内置指令,顺便简单说说作用域的问题. ng-model 将表单控件和当前作用 ...
- LINUX 笔记-tee命令
作用:把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中 格式:tee filename 例:who | tee who.out 使用who命令,结果输出到屏幕上,同时保存在who.out文 ...