MySQL insert语句锁分析
最近对insert的锁操作比较费解,所以自己动手,一看究竟。主要是通过一下三个sql来看一下执行中的sql的到底使用了什么锁。
select * from information_schema.INNODB_TRX\G; //记录当前正在执行的事务,以及事务的一些状态
select * from information_schema.INNODB_LOCKS\G; //包含了InnoDB事务锁的具体情况,包括事务正在申请加的锁和事务加上的锁。
select * from information_schema.INNODB_LOCK_WAITS; //包含了blocked的事务的锁等待的状态
mysql的版本:5.6.25-73.1-log 使用了innodb,隔离级别是 REPEATABLE-READ
首先看下表结构: 表中有唯一键
分别在俩个事务中执行同样的insert操作:
insert into room_poi_cut_result (poi_id,poi_orgunit_id,old_bd,new_bd,cut_reason,is_execute) values(12345,22,12,12,0,0);
首先看下 INNODB_TRX 表的数据:可以看到 事务10722584462处于执行状态,事务10722584486处于阻塞状态
然后再看下锁的状态:可以看到,事务10722584462和事务10722584486都是在获取行锁,一个是S锁,一个是X锁
最后我们看下 INNODB_LOCK_WAITS 这个表中的数据:可以看到事务10722584486正在被阻塞在10722584486:29178:10:638 这个锁上,而这个锁的持有者是事务10722584462
所以,这里可以得到结论,首先会在唯一键加上行锁,其次insert语句会有一个锁升级的过程,从S锁升级到X锁。
接下来做第二个实验,在inser中加入 on update语句。
分别在俩个事务中执行同样的insert操作:
insert into room_poi_cut_result (poi_id,poi_orgunit_id,old_bd,new_bd,cut_reason,is_execute) values(12345,22,12,12,0,0) on duplicate key update poi_id=12345;
然后再看下INNODB_TRX,INNODB_LOCKS,INNODB_LOCK_WAITS 这三个表的数据:
结论,首先会在唯一键加上行锁,其次和第一次实验不同的是,直接是在唯一键上加X锁。
接下来做第三个实验,把表的唯一键去掉,然后执行insert操作:
表结构:
然后在俩个事务中执行以下insert语句:
insert into room_poi_cut_result2 (poi_id,poi_orgunit_id,old_bd,new_bd,cut_reason,is_execute) values(12345,22,12,12,0,0);
结果没有发生阻塞,看下INNODB_TRX 这个表中的数据:可以看到俩个事务都是在running状态,而且trx_rows_locked 都是0
MySQL insert语句锁分析的更多相关文章
- 使用 xlrd 模块实现对excel 的读取、excel转json 、excel 转 mysql insert 语句
#-*- coding:utf-8 -*- # 处理 excel 中的 area 为 Mysql insert 语句 import xlrd, json, codecs, os # data = xl ...
- mysql INSERT语句 语法
mysql INSERT语句 语法 作用:用于向表格中插入新的行. 语法:INSERT INTO 表名称 VALUES (值1, 值2,....)或者INSERT INTO table_name (列 ...
- MySQL INSERT语句
insert的语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] ...
- Mysql insert语句的优化
1) 如果你同时从同一客户插入很多行,使用多个值表的INSERT语句.这比使用分开INSERT语句快(在一些情况中几倍). Insert into test values(1,2),(1,3), ...
- MySQL Insert语句单个批次数量过多导致的CPU性能问题分析
[问题] 最近有台服务器比较频繁的CPU报警,表现的特征有CPU sys占比偏高,大量慢查询,大量并发线程堆积.后面开发对insert的相关业务限流后,服务器性能恢复正常. [异常期间线程处理情况] ...
- 简例 一次执行多条mysql insert语句
package com.demo.kafka;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Prep ...
- mysql insert语句错误问题解决
好久没有复习数据库了,竟然忘记了mysql中的关键字(保留字),导致今天一晚上都在查找sql语句错误,特此记录此错误,教训啊. 我在mysql数据库中有一个名为order 的表,啊啊啊啊啊,为啥我给他 ...
- excel 里面拼接 MySQL insert 语句
="('"&A2&"',"&" '"&B2&"','"&C2&& ...
- MySQL update语句和insert插入语句写法完全不一样啊,不要搞混
1.mysql update 语句: update user set name = 'xiaoming',age = 18 where uid = 3000; 更新记录时update操作也不需要写ta ...
随机推荐
- redis消息通知(任务队列/优先级队列/发布订阅模式)
1.任务队列 对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理. 队列最基础的方法如下: ...
- C#各种小问题汇总不断更新
IIS Express Worker Process已停止工作-->管理员身份运行CMD 输入netsh winsock reset 回车OK 未能从程序集“System.ServiceMode ...
- 系统计划 Cron作业 为什么/etc/crontab /etc/cron.d /etc/cron.* 那么多的定义方式????
当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab.但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的.例如,增加一项定时的备份任务,我们可以这样处 ...
- try、catch、finally都有return语句时执行哪个
任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话.如果finally中有return语句,那么程序就return了,所以finally中 ...
- c/c++ 整数除预算保留小数
两个整数相除会自动省略小数点后的小数位即使下面这种: int a,int b; int a = 4; int b = 3; double d = a/b; d= 1.0000000; -------- ...
- 29 _react-router说明
一.SPA的理解 1.单页面web应用(single page web application ,SPA) 2.整个应用只有一个完整的页面 3.点击页面中的链接不会刷新页面,本身也不会向服务器发请求 ...
- 2018SDIBT_国庆个人第七场
A - Complete the Word(暴力) Description ZS the Coder loves to read the dictionary. He thinks that a wo ...
- CSS3 Box-sizing(转载)
转载自:W3CPLUS Airen的博客:http://www.w3cplus.com/content/css3-box-sizing box-sizing是CSS3的box属性之一.一说到CSS的盒 ...
- Android关于API level、buildToolVersion、CompileSdkVersion
API level: API level是一个整数,它指的是我们使用的框架(Framework)的版本,也就是我们使用的sdk中的各个平台下的android.jar. 但是这个API level又和A ...
- ide调试
F8: 程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行) F7: 程序向下执行一行.如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法) Alt + ...