1、表结构

CREATE TABLE `t3` (`id` int(11) NOT NULL,`id2` int(11) DEFAULT NULL,`id3` int(11) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `id2` (`id2`,`id3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、数据

mysql> select *from t3;
+----+------+------+
| id | id2  | id3  |
+----+------+------+
|  6 |    1 |    1 |
|  8 |    1 |    2 |
| 10 |    1 |    3 |
|  7 |    4 |    4 |
|  1 |    6 |    6 |
|  4 |    7 |    7 |
+----+------+------+
6 rows in set (0.00 sec)

3、插入第一条语句

mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into t3 values(11,1,4);
Query OK, 1 row affected (0.00 sec)

该事务中,唯一二级索引(1,4,11)加的是隐式锁,即没有加锁的。

4、插入第二条语句

mysql> insert into t3 values(12,1,4);
ERROR 1062 (23000): Duplicate entry '1-4' for key 'id2'

此时先将(1,4,11)隐式锁转换成显示锁,该锁是X类型的LOCK_REC_NOT_GAP锁;然后因为重复key,对其加S类型的LOCK_ORDINARY锁。

5、

流程原理图,参考之前章节。

6、总结

InnoDB实现了一个延迟加锁机制,减少加锁的数量,即隐式锁。
隐式锁特点:
1、只有在很可能发生冲突时才加锁,减少锁的数量
2、隐式锁针对被修改的B+tree记录,因此都是记录类型的锁,即只锁记录,不可能是gap或next-key锁。
3、insert操作只加隐式锁,不需要加显示锁
4、update、delete在查询时,直接对查到的主键加显示锁,对其他索引加隐式锁。
   理论上,可以对主键加隐式锁的。提前加显示锁应该是为了减少死锁的发生。insert、update、delete操作都是从主键开始的,因此对主键加锁可以有效阻止死锁
   https://www.cnblogs.com/yuyue2014/p/5527923.html
5、锁兼容判断条件是不同事务之间;强度判断是在相同事务之间

6、当前事务insert into t3 values(11,1,4);insert into t3 values(12,1,4);

第二个语句先将上一条的隐式锁转换成显示锁;
     然后在加S类型的next-key锁:因为是同一个事务,不存在兼容性;
     虽然X类型强度大于S类型,但是X类型是LOCK_REC_NOT_GAP,而S类型的是LOCK_ORDINARY,可以加锁成功;
     判断强度时,只判断同模式的,即next-key与next-key,not gap与not gap

InnoDB事务锁之行锁-insert唯一二级索引-隐式锁转换案例相关推荐

  1. MySQL5.7 : 对隐式锁转换的优化

    MySQL5.7 : Reduce lock_sys_t::mutex contention when converting implicit lock to an explicit lock wor ...

  2. Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock

    显式锁Explicit Table Lock与隐式锁Explicit Table Lock 显式锁Explicit Table Lock 显式表锁(Explicit Table Locks)即通过命令 ...

  3. JUC-9.“锁”事(显式锁与隐式锁/悲观锁与乐观锁/公平锁与非公平锁/可重入锁/读写锁(独占/共享/降级)/邮戳锁/死锁)、锁升级

    目录 一.悲观锁与乐观锁 1.1 悲观锁 1.2 乐观锁 二.公平锁与非公平锁 2.1 为什么会有公平锁/非公平锁的设计为什么默认非公平? 2.2 如何选择使用哪种锁? 三.可重入锁(又名递归锁) 3 ...

  4. java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  5. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁

    锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...

  6. InnoDB 事务/锁/多版本分析?你了解多少?

    目录 • InnoDB事务 – 事务结构/功能 – XA事务/Group Commit – mini-transaction• InnoDB锁 – 锁结构/类型/功能 – 锁等待/死锁检测 – 自增序 ...

  7. mysql 事务 innodb 锁表_MySQL性能优化之Innodb事务系统,值得收藏

    概述 今天主要分享下Innodb事务系统的一些优化相关,以下基于mysql 5.7. Innodb中的事务.视图.多版本 1.事务 在Innodb中,每次开启一个事务时,都会为该session分配一个 ...

  8. MySQL · 引擎特性 · InnoDB 事务子系统介绍

    前言 在前面几期关于InnoDB Redo和Undo实现的铺垫后,本节我们从上层的角度来阐述InnoDB的事务子系统是如何实现的,涉及的内容包括:InnoDB的事务相关模块,如何实现MVCC及ACID ...

  9. mysql锁(全局锁、表锁、行锁、页锁、排他锁、共享锁)

    mysql锁 简介 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则. MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储 ...

  10. Mysql锁之——行锁

    这篇文章我们来聊聊Mysql的行锁 InnoDB的行锁包括:记录锁.间隙锁(Gap Lock,解决幻读问题)和组合锁. 两阶段锁协议 在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需 ...

最新文章

  1. 如何成为Java程序员
  2. oracle case grouping,ORACLE GROUPING函數的使用
  3. .net 文件服务器系统,File-service基于ASP.NET Core的可伸缩、通用的文件服务器
  4. 禁用任何未使用的端口com_[pc玩家]如何在Windows 10中禁用USB端口
  5. Linux Ubuntu常用命令
  6. 当clear line vty 命令不起作用时
  7. Windows消息机制详解-2
  8. html5怎样实现信息抓取,HTML5获取定位简单方案
  9. == 和 === 有什么区别
  10. 命令行插入时显示不存在_成年人的世界里,不存在“容易”两个字没人心疼时自己要学会坚强...
  11. 在SQL Server中对视图进行增删改
  12. 增强for中操作集合元素的误区---java.util.ConcurrentModificationException
  13. oracle转为纯大写,Oracle认证:oracle中小写转换成大写方法
  14. 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
  15. DecoupleSegNet结构解读
  16. 奥地利邮政服务推出加密收藏邮票
  17. 百度图标html代码,css 画的百度LOGO
  18. 手把手教你基于PaddlePaddle的情绪识别
  19. 企业邮箱哪个最好用?哪个企业邮箱更优惠?费用是多少?
  20. adb install 命令参数

热门文章

  1. 【清华夏令营模拟2019.5.22】连续段(析合树+多项式牛顿迭代)
  2. 好学易懂 从零开始的插头DP(二)
  3. bootstrap布局基础
  4. MATLAB做机器人仿真第一讲:如何调用link函数
  5. 学习OpenCV2——opencv2.4.8和opencv3的安装和配置
  6. 章丘AAA企业信用评级申请条件和流程
  7. 初学者理解,HTML,CSS,Javascript,三者关系。
  8. python函数方法练习
  9. case语句 oracle,Oracle的Case语句
  10. 正确评估貌似可行的策略及其陷阱