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. logback error 分开存日志

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <property ...

  2. IOS开发-基于WebDriverAgent代理服务,实现iOS手机app自动化测试的框架搭建

    导引 iOS自动化测试一直使用的appium,iOS系统升级至10.0 Xcode8.0之后,改用WebDriverAgent代理服务作为server,编写了一套基于WebDriverAgent服务 ...

  3. thinkphp Model的使用

    4.1 放在哪儿?项目/模块/Model目录下以本教程为例,Home模块的Model/Home/Model/目录下 4.2 model类文件叫什么?模型名: DemoModel.class.php 4 ...

  4. import与export

    expoer default 输出的是一个对象 export 输出的是对象的一个元素

  5. js 实现继承的几种方式

    //js中实现继承的几种方式 //实现继承首先要有一个父类,先创造一个动物的父类 function Animal(name){ this.name = name; this.shoot = funct ...

  6. Linux安装mysql记录 重置密码

    重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...

  7. 关系型数据库---MySQL---事务

    1.概述 1.1 事务:在对业务相关的一系列数据进行操作时,需要保证数据操作的完整性(要么全部成功.要么全部失败): 1.2 MySQL中支持事务的存储引擎是:Innodb: 1.3 事务用来管理in ...

  8. Big Data Opportunities and Challenges(by周志华)论文要点

    大数据环境下的机器学习 三种误解:模型不再重要(大量数据上复杂模型依然提升显著,大数据是的复杂模型充分利用数据且难以过拟合),相关性就足够了(因果关系重要性无法被替代),以前的研究方向不再重要(高性能 ...

  9. PlayMaker 设置颜色 Set Materia lColor

    1. 指定一个游戏对象,Color处设为红色,执行这个行为后就把游戏对象的材质变为了红色: 2. Color也可以使用一个弄好的Color类型的变量,如下图:Color处用了一个提前设置好的变量

  10. Cache一致性协议之MESI

    http://blog.csdn.net/muxiqingyang/article/details/6615199 Cache一致性协议之MESI 处理器上有一套完整的协议,来保证Cache一致性.比 ...