##==============================================================================##

学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的更多相关文章

  1. mysql锁SELECT FOR UPDATE【转】

    MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE ...

  2. Mysql 锁表 for update (引擎/事务)

    因为之前用过oracle,知道利用select * for update 可以锁表.所以很自然就想到在mysql中能不能适应for update来锁表呢. 学习参考如下 由于InnoDB预设是Row- ...

  3. 对mysql锁机制的学习

    1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...

  4. 【MySQL】MySQL悲观锁 + 事物 + for update 解决普通流量并发的问题

    使用mysql悲观锁解决并发问题   最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事 ...

  5. MySQL中select * for update锁表的范围

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  6. MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  7. mysql 通过测试'for update',深入了解行锁、表锁、索引

    mysql 通过测试'for update',深入了解行锁.表锁.索引 条件 FOR UPDATE 仅适用于InnoDB存储引擎,且必须在事务区块(BEGIN/COMMIT)中才能生效. mysql默 ...

  8. MYSQL进阶学习笔记八:MySQL MyISAM的表锁!(视频序号:进阶_18-20)

    知识点九:MySQL MyISAM表锁(共享读锁)(18) 为什么会有锁: 打个比方,我们到淘宝买一件商品,商品只有一件库存,这时候如果还有另外一个人也在买,那么如何解决是你买到还是另一个人买到的问题 ...

  9. MySQL学习(三)MySQL锁与事务

    本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. 一.MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支 ...

随机推荐

  1. BZOJ-1192-[HNOI2006]鬼谷子的钱袋

    Description 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政.有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行)将要举行一场拍卖会,其中有一 ...

  2. 箱线图(boxplot)简介与举例

    简述:   盒图是在1977年由美国的统计学家约翰·图基(John Tukey)发明的.它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(m ...

  3. 委托、事件、Observer观察者模式的使用解析二

    一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...

  4. Python实战之用类的静态方法实现登录验证

    #!usr/bin/env Python3 # -*-coding:utf-8-*- __author__="William" #define a class,just to le ...

  5. HashMap实现原理

    学习笔记之HashMap篇,简单学习了解HashMap的实现原理和扩容. 大家都知道HashMap处理数据很快,时间复杂度O(1),那么是怎么做到的呢?那就先了解一下常见数据结构. 一般来说,我们把存 ...

  6. Jquery字符串,数组(拷贝、删选、合并等),each循环,阻止冒泡,ajax出错,$.grep筛选,$.param序列化,$.when

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. JS里try...catch...finally详解,以及console日志调试(console.log、console.info等)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. 一些精妙的sql语句收集

    --1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) --法一: select * into b from a where 1<>1 --法二: select ...

  9. cmd启动,重启,停止IIS命令

    直接使用CMD我们可以操作很多事情,比如启动IIS,重启IIS,停止IIS 重启IIS服务器,开始->运行->cmd (以下列出相关操作命令): iisreset /RESTART 停止后 ...

  10. 使用测试思路快速学习Python-适合测试工程师的学习方法

    本文采用Python doctest单元测试的方法,直接用代码学习代码,滚雪球式的迭代学习. doctest是一个python标准库自带的轻量单元测试工具,适合实现一些简单的单元测试.它可以在docs ...