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. Python数据分析之pandas学习(基础操作)

    一.pandas数据结构介绍 在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame.Series类似于numpy中的一维数组,除了通吃一维数组可用的函数或方法,而且其 ...

  2. TreeMap读源码总结

    红黑树: 定义 A red–black tree is a kind of self-balancing binary search tree in computer science. Each no ...

  3. hive on hbase

    },{NAME },{NAME } put 'ccc20180710','ooccpp.com','f1:c1','name1' put 'ccc20180710','ooccpp.com','f1: ...

  4. spring boot 启动时运行代码(2)ApplicationListener

    项目概览: StepExecutor: @Component @Slf4j public class StepExecutor implements Runnable { @Autowired pri ...

  5. my.答题

    20170821增加: http://www.119you.com/mhxy/yxgl/738653.shtml 1.三界奇缘 http://my.netease.com/forum.php?mod= ...

  6. 移动测试之appium+python 入门代码(三)

    在做app自动化过程中会踩很多坑,咱们都是用中文的app,所以首先要解决中文输入的问题!本篇通过屏蔽软键盘,绕过手机的软键盘方法,解决中文输入问题. 一.定位搜索 1.打开淘宝点击搜索按钮,进入搜索页 ...

  7. C++计算二叉树的节点数和高度

    用struct结构体的写法: /* * description: 计算二叉树的层数和节点数 * writeby: nick * date: 2012-10-23 16:16 * */ #include ...

  8. php表单提交时的身份证号码验证

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

  9. 为什么地址栏的快捷键是Alt D

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:为什么地址栏的快捷键是Alt D.

  10. Java入门之IDE集成开发环境安装及配置

    常用的开发工具 一.Eclipse Eclipse 是一个开放源代码的.基于 Java 的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse ...