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编程>事务编程一章之后,根据自己的理 ...
随机推荐
- 【GMT43智能液晶模块】例程二十一:DMA LAN实验——高速数据传输测速
源代码下载链接: 链接:https://pan.baidu.com/s/1wQomZvOUP9_ZslZus_NSIA 提取码:3fmf 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43 ...
- osgb文件过大,可以通过Compressor=zlib对纹理进行压缩
osg::ref_ptr<osgDB::ReaderWriter::Options> options = new osgDB::ReaderWriter::Options; options ...
- Jenkins build 后 tomcat 启不来
Jenkins build 后 war 包复制到 tomcat 下,启不来 添加 :export BUILD_ID=dontKillMe /usr/local/iron/tomcat8085/bin/ ...
- 【454】ML-DL相关链接
GD(梯度下降)和SGD(随机梯度下降) 机器学习中的Bias和Variance 机器学习之判别式模型和生成式模型 笔记 | 什么是Cross Entropy
- Ubuntu tricks
linux 复制文件夹内所有文件到另一个文件夹 cp -Rf /home/user1/* /root/temp/ 将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user ...
- 仿简书MarkDown编辑器可同步滚动
模仿简书的MarkDown编辑器,使用Angular8写的示例 1.支持同步滚动 编辑的过程中,右侧预览界面会同步滚动.滚动右侧预览界面,左侧编辑区也会同步滚动哦 2.支持语法高亮 如下: using ...
- Dockerfile常用指令说明
具体解释:https://blog.csdn.net/achenyuan/article/details/80231922 将dockerfile文件和生成好的jar 使用ftp工具上传到linux服 ...
- 头部文件jq嵌入笔记
var headHtml = '<div class="container">' + '<div class="navbar-header"& ...
- 复杂的sql参考(3)
SELECT apply.assets_code, apply.loan_apply_code, cust.cust_name, cust.id_no, cust.mobile, platform.p ...
- DRF框架(四)——单整体改(put)、单局部改(patch)、群局部改(patch)
单整体改 单指的是单独一条数据,整体指这条数据的所有字段都必须传值修改 基于上篇文章的代码修改,序列化层不用变,只修改views.py 1) 单整体改,说明前台要提供修改的数据,那么数据就需要校验 ...