MySQL Lock--MySQL INSERT加锁学习
准备测试数据:
## 开启InnoDB Monitor
SET GLOBAL innodb_status_output=ON;
SET GLOBAL innodb_status_output_locks=ON; ## 创建测试表
DROP TABLE IF EXISTS tb1001; CREATE TABLE `tb1001` (
`order_id` INT(11) NOT NULL,
`order_num` INT(11) DEFAULT NULL,
`order_type` INT(11) DEFAULT NULL,
PRIMARY KEY (`order_id`),
KEY `idx_order_type` (`order_type`)
) ENGINE=INNODB DEFAULT CHARSET=utf8; ## 准备测试数据
INSERT INTO tb1001(order_id,order_num,order_type)
VALUES(10,10,10),(20,10,20),(21,10,20),(30,10,30),(40,10,40); ## 查看当前表数据
SELECT * FROM tb1001;
+----------+-----------+------------+
| order_id | order_num | order_type |
+----------+-----------+------------+
| 10 | 10 | 10 |
| 20 | 10 | 20 |
| 21 | 10 | 20 |
| 30 | 10 | 30 |
| 40 | 10 | 40 |
+----------+-----------+------------+
测试1:
## 先执行事务A但不提交
BEGIN;
INSERT INTO tb1001(order_id,order_num,order_type)
VALUES(19,20,10)
上面操作执行后,使用SHOW ENGINE INNODB STATUS查看锁信息
---TRANSACTION 1454597, ACTIVE 353 sec
2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
MySQL thread id 83, OS thread handle 140361075443456, query id 293 127.0.0.1 admin
TABLE LOCK table `db001`.`tb1001` trx id 1454597 lock mode IX
RECORD LOCKS space id 29 page no 3 n bits 80 index PRIMARY of table `db001`.`tb1001` trx id 1454597 lock_mode X locks rec but not gap
Record lock, heap no 7 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
0: len 4; hex 80000013; asc ;;
1: len 6; hex 000000163205; asc 2 ;;
2: len 7; hex a50000001c0110; asc ;;
3: len 4; hex 80000014; asc ;;
4: len 4; hex 8000000a; asc ;;
上面事务加两个锁:
1、表上加意向修改锁(IX)。
2、在新插入的记录上加行锁(RECORD LOCKS ..lock_mode X locks rec but not gap)
测试2:
## 先执行事务A但不提交
BEGIN;
INSERT INTO tb1001(order_id,order_num,order_type)
VALUES(19,20,10) ## 先执行事务B
## 事务B被阻塞
BEGIN;
INSERT INTO tb1001(order_id,order_num,order_type)
VALUES(19,20,10)
上面操作执行后,使用SHOW ENGINE INNODB STATUS查看锁信息
---TRANSACTION 1454599, ACTIVE 4 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 82, OS thread handle 140361075709696, query id 335 127.0.0.1 admin update
INSERT INTO tb1001(order_id,order_num,order_type)
VALUES(19,20,10)
------- TRX HAS BEEN WAITING 4 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 29 page no 3 n bits 80 index PRIMARY of table `db001`.`tb1001` trx id 1454599 lock mode S waiting
Record lock, heap no 7 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
0: len 4; hex 80000013; asc ;;
1: len 6; hex 000000163205; asc 2 ;;
2: len 7; hex a50000001c0110; asc ;;
3: len 4; hex 80000014; asc ;;
4: len 4; hex 8000000a; asc ;; ------------------
TABLE LOCK table `db001`.`tb1001` trx id 1454599 lock mode IX
RECORD LOCKS space id 29 page no 3 n bits 80 index PRIMARY of table `db001`.`tb1001` trx id 1454599 lock mode S waiting
Record lock, heap no 7 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
0: len 4; hex 80000013; asc ;;
1: len 6; hex 000000163205; asc 2 ;;
2: len 7; hex a50000001c0110; asc ;;
3: len 4; hex 80000014; asc ;;
4: len 4; hex 8000000a; asc ;; ---TRANSACTION 1454597, ACTIVE 590 sec
2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
MySQL thread id 83, OS thread handle 140361075443456, query id 293 127.0.0.1 admin
TABLE LOCK table `db001`.`tb1001` trx id 1454597 lock mode IX
RECORD LOCKS space id 29 page no 3 n bits 80 index PRIMARY of table `db001`.`tb1001` trx id 1454597 lock_mode X locks rec but not gap
Record lock, heap no 7 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
0: len 4; hex 80000013; asc ;;
1: len 6; hex 000000163205; asc 2 ;;
2: len 7; hex a50000001c0110; asc ;;
3: len 4; hex 80000014; asc ;;
4: len 4; hex 8000000a; asc ;;
查看事务锁信息:
SELECT *
FROM `information_schema`.`INNODB_LOCKS` \G
*************************** 1. row ***************************
lock_id: 1454606:29:3:7
lock_trx_id: 1454606
lock_mode: S
lock_type: RECORD
lock_table: `db001`.`tb1001`
lock_index: PRIMARY
lock_space: 29
lock_page: 3
lock_rec: 7
lock_data: 19
*************************** 2. row ***************************
lock_id: 1454605:29:3:7
lock_trx_id: 1454605
lock_mode: X
lock_type: RECORD
lock_table: `db001`.`tb1001`
lock_index: PRIMARY
lock_space: 29
lock_page: 3
lock_rec: 7
lock_data: 19
绿色表示锁申请完成,黄色表示申请锁失败被阻塞。
加锁详解:
Insert操作加锁规则
1、INSERT操作会对新插入的记录加行锁(ROW LOCK)+排他锁(X LOCK),不会产生任何GAP锁和Next-Key锁
2、在插入记录前,会向插入记录所在位置申请意向插入Gap锁(Insertion Intention Gap LOCK),相同区间的意向插入Gap锁不会冲突。
3、对于唯一索引,如果插入记录时表中已存在相同键值记录(被其他事务修改且未提交),即存在唯一键冲突,会尝试在已有记录上加读锁,然后等待。 加锁操作:
1、事务A插入操作完成,对新插入记录加行锁(ROW LOCK)+排他锁(X LOCK),且不会任何加GAP锁,因此锁信息为:
RECORD LOCKS SPACE id 29 page NO 3 n bits 80 INDEX PRIMARY of TABLE `db001`.`tb1001` trx id 1454605 lock_mode X LOCKS rec but NOT gap
Record LOCK, HEAP NO 7 PHYSICAL RECORD: n_fields 5; COMPACT FORMAT; info bits 0
0: len 4; HEX 80000013; ASC ;; order_id=19 2、事务B执行插入操作,由于在记录order_id=19上存在唯一键冲突,因此改为申请记录order_id=19上的S锁,又由于事务A上持有记录order_id=19上的行锁(ROW LOCK)+排他锁(X LOCK),事务B申请S锁被阻塞,锁信息为:
RECORD LOCKS SPACE id 29 page NO 3 n bits 80 INDEX PRIMARY of TABLE `db001`.`tb1001` trx id 1454606 LOCK MODE S waiting
Record LOCK, HEAP NO 7 PHYSICAL RECORD: n_fields 5; COMPACT FORMAT; info bits 0
0: len 4; HEX 80000013; ASC ;; order_id=19
MySQL Lock--MySQL INSERT加锁学习的更多相关文章
- MySQL Lock--MySQL加锁学习2
准备测试数据: ## 开启InnoDB Monitor SET GLOBAL innodb_status_output=ON; SET GLOBAL innodb_status_output_lock ...
- MySQL Lock--MySQL加锁学习1
准备测试数据: ## 开启InnoDB Monitor SET GLOBAL innodb_status_output=ON; SET GLOBAL innodb_status_output_lock ...
- (转)mysql、innodb和加锁分析
mysql.innodb和加锁分析 原文:https://liuzhengyang.github.io/2016/09/25/mysqlinnodb/ 介绍 本文主要介绍MySQL和InnoDB存储引 ...
- PHP,mysql,Linux,CI框架学习总结
PHP,mysql,CI框架学习总结 PHP标记 1.Xml风格<?php ?> 2.简短风格 <? ?> 需在php.ini中开启short_open_tag 3.asp风格 ...
- [MySQL] lock知识梳理
MySQL Lock机制 INDEX: MySQL事务隔离级别 MVCC MySQL Lock类型 MySQL MDL CONTENT: 1. MySQL事务隔离级别 Read Uncommit RU ...
- MySQL中的联合索引学习教程
MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下 联合索引又叫复合索引.对于复合索引:Mysql从左到 ...
- mysql show processlist 命令检查mysql lock
processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1. 进入mysql/bin目录下输入mysqladmin processlist; ...
- MySql基本的语法(学习笔记)
MySQL语法大全_自己整理的学习笔记 select * from emp; #凝视 #--------------------------- #----命令行连接MySql--------- #启 ...
- MySQL基础之事务编程学习笔记
MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...
随机推荐
- WebGL学习笔记(十):雾化
雾化是指距离我们较远的物体看不清晰的情况,比如模拟大雾环境,或者模拟水下环境时会用到. 实现雾化的方式有很多种,我们这里使用的是线性雾化的方式: 线性雾化 线性雾化比较简单,我们算出每个像素点到摄像机 ...
- 使用 Laravel-Swagger 编写接口文档(php)
使用 Laravel-Swagger 编写接口文档 Table of Contents Swagger 文档管理 官方网站:https://swagger.io/ 快速编写你的 RESTFUL API ...
- 推荐一款好用的免费FTP客户端Filezilla
官网地址:https://filezilla-project.org/
- commitlint那些事儿
这里主要介绍提交信息用到的 cz 工具集. 一.生成器 commitizen,cz`生成提交说明`,格式化 git commit message. # 全局安装cz npm install -g co ...
- url、href、src
一.URL的概念 统一资源定位符(或称统一资源定位器/定位地址.URL地址等,英语:Uniform Resource Locator,常缩写为URL),有时也被俗称为网页地址(网址).如同在网络上的门 ...
- web端测试总结
1.数值型输入框: 条件:demcial(x,y) ,界面显示小数点到y位 通常要检查以下几点: (1)边界值:最大值.最小值.最大值+1.最小值-1 (2)位数:最小位数.最大位数.最小位数-1最 ...
- Ipinstall软件工具-可视对讲
Ipinstall软件工具操作说明 安居宝Ipinstall软件工具是用于联网型对讲系统中网络设备的属性及参数修改,该设备在系统中是否能正常运行,其属性和参数的设置起着决定性的作用, 然而设备的属性. ...
- UE4 移动物体的几种方法
转自:https://dawnarc.com/2016/06/ue4%E7%A7%BB%E5%8A%A8%E7%89%A9%E4%BD%93%E7%9A%84%E5%87%A0%E7%A7%8D%E6 ...
- TopShelf+Quartz.net 实现window服务
Quartz.NET官网 TopShelf 网址 代码地址:https://github.com/SeaLee02/ProjectDemo/tree/master/WindowServerDemo ...
- 电视CI卡详解
CAM卡中文名视密卡,它是一种数字视频条件接收模块,是一个连接电视机与外部信号源的设备.它可以将压缩的数字信号转成电视内容,并在电视机上显示出来.CAM卡(亦称大卡)和智能卡(亦称小卡)配合使用,插入 ...