create table t1(
c1 int(10) unsigned not null default '0',
c2 int(10) unsigned not null default '0',
c3 int(10) unsigned not null default '0', 
c4 int(10) unsigned not null default '0', 
primary key(c1),
key c2(c2)
) engine=innodb
 
 
|    c1 |  c2  |   c3  |  c4  | 
+-----+-----+-----+-----+  
|   0   |   0   |    0  |   0   |  
|   1   |   1   |    1  |   0   |  
|   3   |   3   |    3  |   0   |  
|   4   |   2   |    2  |   0   |  
|   6   |   2   |    2  |   0   |  
|   8   |   6   |    6  |   0   |  
|   10 |   4   |    4  |   0   |  
 
隔离级别为RR
 
例子1:
T1 T2
begin begin
select * from t1 where c1=3 for update

|    c1 |  c2  |   c3  |  c4  | 
+-----+-----+-----+-----+  
|   3   |   3   |    3  |   0   |  
 
  select * from t1 where c1=3 lock in share mode
这种情况会被阻塞,因为T1是排它锁,T2是共享锁,排它锁和共享锁是互斥的。

 
 
  
例子2:
T1 T2
begin begin
select * from t1 where c1=3 lock in share mode

|    c1 |  c2  |   c3  |  c4  | 
+-----+-----+-----+-----+  
|   3   |   3   |    3  |   0   |  
 
  select * from t1 where c1=3 for update
这种情况会被阻塞,因为T1是共享锁,T2是排它锁,排它锁和共享锁是互斥的。

 
 
 
例子3:
T1 T2
begin begin
select * from t1 where c1=3 for update

|    c1 |  c2  |   c3  |  c4  | 
+-----+-----+-----+-----+  
|   3   |   3   |    3  |   0   |  
 
  select * from t1 where c1=3 
这种情况不会被阻塞,因为T2是一次性非锁定读。

 
 
  
 
例子4:
T1 T2
begin begin
select * from t1 where c3=7 lock in share mode

 
 
  select * from t1 where c3=10 for update
备注:c3无索引
这种情况会被阻塞,因为T2中,C3无索引,所以会升级为表级锁。

 
 
  
例子5:
T1 T2
begin begin
select * from t1 where c3=7 lock in share mode

 
 
  select * from t1 where c1=6 for update
备注:c1是主键
这种情况会被阻塞,因为T1中c3无索引,会造成表级锁。

 
 
  
例子6:
T1 T2
begin begin
select * from t1 where c2=2 and c3=5 for update

 
 
  select * from t1 where c2=2 and c3=7 for update
备注:c2列上有索引,c3列上无索引,c3=7不存在
这种情况会被阻塞,因为c2=2,此列上有索引,这个记录上会加一个排它锁。T1和T2中的C3没有索引,所以不能判断是不是同一个记录,他只有将所有记录都加上锁。
 
 
  
 
 例子7:
T1 T2
begin begin
select * from t1 where c2=2 and c3=5 for update

 
 
  select * from t1 where c2=3 and c3=7 for update
备注:c2列上有索引,c3列上无索引,c3=7不存在
这种情况不会被阻塞,锁是基于索引的,T1中c2=2和 T2中c2=3并不是同一条数据。
 
 
  
 例子8:
T1 T2
begin begin
select * from t1 where c2=2 and c3=2 for update

 
 
  select * from t1 where c1=4 and c3=10 for update
备注:c1是主键,c2是普通索引,c3列上无索引
这种情况会被阻塞,因为在c2=2上加锁,最终会回溯到主键c1=4上也加锁。
 
 
  
 
例子9:
T1 T2
begin begin
update t1 set c4=20 where c2>=4  
select * from t1 where c2>=4 select * from t1 where c1=7 for update
备注:c1列是主键,c2列是普通索引,T1影响了两行。
这种情况不会被阻塞,T1锁定的范围是c2>=4的所有记录,且是next lock,以及c1=8 & c1=10的record lock,T2锁定的范围是c1=7的 record lock。 
 
 
  
例子10:
T1 T2
begin begin
update t1 set c4=20 where c2>=4  
select * from t1 where c2>=4 insert into t1 select 7,5,10,10
备注:c1列是主键,c2列是普通索引,T1影响了两行。
这种情况会被阻塞,T1锁定的范围是c2>=4的所有记录,且是next lock,以及c1=8 & c1=10的record lock,
在T2中 5>4,所以会被阻塞。
 
 
  
例子11:
T1 T2
begin begin
update t1 set c4=20 where c2>=4  
select * from t1 where c2>=4 insert into t1 select 7,2,10,10
备注:c1列是主键,c2列是普通索引,T1影响了两行。
这种情况不会被阻塞,T1锁定的范围是c2>=4的所有记录,且是next lock,以及c1=8 & c1=10的record lock,
在T2中 2<4,不管T1还是T2都不在范围内,所以不会被阻塞。
 
 
 
例子12:
T1 T2
begin begin
update t1 set c4=20 where c1>=6  
  insert into t1 select 9,9,9,9
备注:c1列是主键,c1=6已经存在
这种情况会被阻塞,因为T1锁定的是所有c1>=6的范围record lock。
 
 
  
 
例子13:
T1 T2
begin begin
insert into t1 select 9,9,9,9  
  insert into t1 select 7,7,7,7
备注:c1列是主键,c1=7和c1=9的记录都不存在
这种情况不会被阻塞,因为C1和C2都不在同一个位置上面
 
 
  
例子14:
T1 T2
begin begin
insert into t1 select 9,9,9,9  
  insert into t1 select 9,9,9,9
备注:c1列是主键,c1=9的记录不存在
这种情况会被阻塞,因为C1和C2都在同一个位置上面
 
 
  

InnoDB锁演示的更多相关文章

  1. MySQL数据恢复和复制对InnoDB锁机制的影响

    MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...

  2. MySQL- InnoDB锁机制

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

  3. MySQL InnoDB锁机制

    概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...

  4. mysql InnoDB锁等待的查看及分析

    说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ...

  5. 【锁】Innodb锁

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

  6. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  7. innodb 锁分裂继承与迁移

    innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记 ...

  8. InnoDB锁机制分析

    InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...

  9. [转载] 数据库分析手记 —— InnoDB锁机制分析

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

随机推荐

  1. SSH防入侵

    1.1 ssh防止入侵方法说明 如何防止SSH登录入侵小结: 1.用密钥登录,不用密码登陆 2.牤牛阵法:解决SSH安全问题 a.防火墙封闭SSH,指定源IP限制(局域网.信任公网) b.开启SSH只 ...

  2. hive 存储格式及压缩

    -- 设置参数 set hivevar:target_db_name=db_dw; use ${hivevar:target_db_name}; -- 创建textfile表 create table ...

  3. c++11 move构造函数和move operator 函数 学习

    先看个代码吧!!!!!!!!!! #include <iostream> using namespace std; class A { public: A(){cout<<&q ...

  4. 性能测试工具LoadRunner01-性能测试基础

    什么是性能测试? 在一定的约束条件下(指定的软件.硬件.网络环境等)对产品按一定的性能指标进行测试,确定系统能承受的最大负载压力,解决性能瓶颈.给用户最好的体验. 性能测试流程? 什么时候开始性能测试 ...

  5. firefox插件-自动化测试工具-selenium IDE

    教程:http://www.yiibai.com/selenium/selenium_download_ide.html 下载地址:https://addons.mozilla.org/en-US/f ...

  6. Spark集群安装MySQL环境

    1.修改yum源 鉴于用国外的Yum源,速度比较慢,所以想到将国外的yum源改为国内的Yum源,这里选择使用比较多的阿里云源.具体修改方法可以参考此连接 我们先新建一个新的文件用来存放Yum源: [k ...

  7. MahApps.Metro控件更換微軟視窗主題

    先來看一下微軟默認的視窗主題(左:Window)與MahApps.Metro的視窗主題(右:MetroWindow), Window   MetroWindow   MetroWindow似乎美觀多了 ...

  8. Navicat连接Oracle数据库报错ORA-28547解决方法

    先说明下我机器的环境: 1.Win10 - 64bit 2.Navicat Premium_11.2.7  - 64bit 3.未安装Oracle数据库(包括Client也未安装) 解决方法: 1.下 ...

  9. .NET MVC强类型参数排除和包含属性

    MVC接收强类型对象时排除或只接收某几个属性时可使用Bind特性: Bind(Include="属性");如果相包含多个属性可以用逗号分割符分开:Bind(Include=&quo ...

  10. ping过程详解

    原出处:http://wanicy.blog.51cto.com/509018/335207/ PS:这里只是给出了ping ip地址的例子,没有给出ping域名的例子. ping 域名还有域名转换成 ...