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. centos7-根据端口号查看所属应用

    [root@cent7-zuoys ~]# netstat -lnp | grep 8080 [root@cent7-zuoys ~]# ps 4735

  2. 23-----BBS论坛

    BBS论坛(二十三) 23.添加板块 (1)apps/models class BoardModel(db.Model): __tablename__ = 'board' id = db.Column ...

  3. php和c++自带的排序算法

    PHP的 sort() 排序算法与 C++的 sort() 排序算法均为不稳定的排序算法,也就是说,两个值相同的数经过排序后,两者比较过程中还进行了交换位置,后期开发应主要这个问题

  4. gitlab 邮件配置

    vim /etc/gitlab/gitlab.rb gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "sm ...

  5. redis的三种启动方式,个人常用第二种

    redis的启动方式1.直接启动  进入redis根目录,执行命令:  #加上‘&’号使redis以后台程序方式运行 1 ./redis-server & 2.通过指定配置文件启动  ...

  6. python 列表学习

    一.创建一个列表(list)_使用逗号分隔不同的数据项,使用方括号括起来. list = [1,2,3,4,5,6,7] 与字符串的索引一样,列表索引从 0 开始,列表可以截取.组合. 二.访问列表中 ...

  7. Mybatis学习笔记2 - 解析config

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  8. Python 多继承(新式类) 的mro算法

    转载自:http://www.cnblogs.com/panyinghua/p/3283831.html mro即method resolution order,主要用于在多继承时判断调的属性的路径( ...

  9. Akka探索第二个例子by fsharp

    本文重度借鉴了github上akkabootcamp教程. 先上代码 open Akka open Akka.Actor open System type Message = | ContinuePr ...

  10. hdu 1561 树形DP n个选m个价值最大

    http://acm.hust.edu.cn/vjudge/problem/18068 #include <iostream> #include <string> #inclu ...