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编程>事务编程一章之后,根据自己的理 ...
随机推荐
- Docker网络模式介绍
一.概述 docker的网络驱动有很多种方式,按照docker官网给出的网络解决方案就有6种,分别是:bridge.host.overlay.macvlan.none.Network plugins, ...
- Superset配置hive数据源
1.在uri中配置 hive://localhost:10000/default 2.查询 3.如果你的hive集群是带有kerberos认证的,hive数据源需要这样配置 hive://xxx:xx ...
- java日期格式转换大全
public class DateFormatUtils { private static Log logger = LogFactory.getLog(DateFormatUtils.class); ...
- LeetCode_485. Max Consecutive Ones
485. Max Consecutive Ones Easy Given a binary array, find the maximum number of consecutive 1s in th ...
- 数学黑洞:卡普雷卡尔常数的php算法实现
首先看一篇文章: 英国广播公司报道,6174乍看没什么奇特之处,但是,自从1949年以来,它一直令数学家.数字控抓狂.痴迷. 不管你挑的四位数是什么,早早晚晚你都会遇到6174:而且,遇到6174就只 ...
- RabbitMQ使用及与spring boot整合
1.MQ 消息队列(Message Queue,简称MQ)——应用程序和应用程序之间的通信方法 应用:不同进程Process/线程Thread之间通信 比较流行的中间件: ActiveMQ Rabbi ...
- 修复Nginx报错:upstream sent too big header while reading response header from upstream
在 nginx.conf 的http段,加入下面的配置: proxy_buffer_size 128k; proxy_buffers 32k; proxy_busy_buffers_size 128k ...
- Spring Boot 项目的 API 接口防刷
首先是写一个注解类 拦截器中实现 注册到springboot中 在Controller中加入注解 说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点:springbo ...
- Linux下signal信号汇总
SIGHUP /* Hangup (POSIX). */ 终止进程 终端线路挂断 SIGINT /* Interrupt (ANSI). */ 终止进程 中断进程 Ctrl+C SIGQUIT /* ...
- sublime配置python环境及快捷键
sublime配置python环境 参考链接:https://blog.csdn.net/VertigozZ/article/details/54574006 快捷键的配置:https://www.c ...