InnoDB事务锁之行锁-insert唯一二级索引-隐式锁转换案例
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唯一二级索引-隐式锁转换案例相关推荐
- MySQL5.7 : 对隐式锁转换的优化
MySQL5.7 : Reduce lock_sys_t::mutex contention when converting implicit lock to an explicit lock wor ...
- Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock
显式锁Explicit Table Lock与隐式锁Explicit Table Lock 显式锁Explicit Table Lock 显式表锁(Explicit Table Locks)即通过命令 ...
- JUC-9.“锁”事(显式锁与隐式锁/悲观锁与乐观锁/公平锁与非公平锁/可重入锁/读写锁(独占/共享/降级)/邮戳锁/死锁)、锁升级
目录 一.悲观锁与乐观锁 1.1 悲观锁 1.2 乐观锁 二.公平锁与非公平锁 2.1 为什么会有公平锁/非公平锁的设计为什么默认非公平? 2.2 如何选择使用哪种锁? 三.可重入锁(又名递归锁) 3 ...
- java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...
- InnoDB 事务/锁/多版本分析?你了解多少?
目录 • InnoDB事务 – 事务结构/功能 – XA事务/Group Commit – mini-transaction• InnoDB锁 – 锁结构/类型/功能 – 锁等待/死锁检测 – 自增序 ...
- mysql 事务 innodb 锁表_MySQL性能优化之Innodb事务系统,值得收藏
概述 今天主要分享下Innodb事务系统的一些优化相关,以下基于mysql 5.7. Innodb中的事务.视图.多版本 1.事务 在Innodb中,每次开启一个事务时,都会为该session分配一个 ...
- MySQL · 引擎特性 · InnoDB 事务子系统介绍
前言 在前面几期关于InnoDB Redo和Undo实现的铺垫后,本节我们从上层的角度来阐述InnoDB的事务子系统是如何实现的,涉及的内容包括:InnoDB的事务相关模块,如何实现MVCC及ACID ...
- mysql锁(全局锁、表锁、行锁、页锁、排他锁、共享锁)
mysql锁 简介 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则. MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储 ...
- Mysql锁之——行锁
这篇文章我们来聊聊Mysql的行锁 InnoDB的行锁包括:记录锁.间隙锁(Gap Lock,解决幻读问题)和组合锁. 两阶段锁协议 在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需 ...
最新文章
- 如何成为Java程序员
- oracle case grouping,ORACLE GROUPING函數的使用
- .net 文件服务器系统,File-service基于ASP.NET Core的可伸缩、通用的文件服务器
- 禁用任何未使用的端口com_[pc玩家]如何在Windows 10中禁用USB端口
- Linux Ubuntu常用命令
- 当clear line vty 命令不起作用时
- Windows消息机制详解-2
- html5怎样实现信息抓取,HTML5获取定位简单方案
- == 和 === 有什么区别
- 命令行插入时显示不存在_成年人的世界里,不存在“容易”两个字没人心疼时自己要学会坚强...
- 在SQL Server中对视图进行增删改
- 增强for中操作集合元素的误区---java.util.ConcurrentModificationException
- oracle转为纯大写,Oracle认证:oracle中小写转换成大写方法
- 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
- DecoupleSegNet结构解读
- 奥地利邮政服务推出加密收藏邮票
- 百度图标html代码,css 画的百度LOGO
- 手把手教你基于PaddlePaddle的情绪识别
- 企业邮箱哪个最好用?哪个企业邮箱更优惠?费用是多少?
- adb install 命令参数