Mysql在InnoDB引擎下索引失效行级锁变表锁案例
先做好准备,创建InnoDB引擎数据表,并添加了相应的索引
DROP TABLE IF EXISTS `innodb_lock`;
CREATE TABLE `innodb_lock` (
`a` int() NOT NULL,
`b` varchar() NOT NULL DEFAULT '',
KEY `index_a` (`a`),
KEY `index_b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ----------------------------
-- Records of innodb_lock
-- ----------------------------
INSERT INTO `innodb_lock` VALUES ('', 'b2');
INSERT INTO `innodb_lock` VALUES ('', '');
INSERT INTO `innodb_lock` VALUES ('', '');
INSERT INTO `innodb_lock` VALUES ('', '');
INSERT INTO `innodb_lock` VALUES ('', '');
INSERT INTO `innodb_lock` VALUES ('', '');
INSERT INTO `innodb_lock` VALUES ('', '');
INSERT INTO `innodb_lock` VALUES ('', '');
INSERT INTO `innodb_lock` VALUES ('', 'b1');
然后分别打开两个Mysql终端,设置autocommit自动提交为0,也就是关闭自动提交功能,事务隔离级别处于可重复读状态;查看一下表数据。
MySQL [test_db]> set autocommit = ;
MySQL [test_db]> select * from innodb_lock;
+---+------+
| a | b |
+---+------+
| | b2 |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | b1 |
+---+------+
接下来在第一个终端执行update语句
MySQL [test_db]> update innodb_lock set b ='' where a = ;
然后第二个终端执行update语句
MySQL [test_db]> update innodb_lock set b = '' where a = ;
发现第二个终端处于阻塞状态,因为这里修改的是同一行数据,只有在第一个终端提交之后,锁被释放,第二个终端执行完了SQL,最后第二个终端也commit提交之后数据才会更改,b的值为'4004'。
我们继续
在第一个终端执行update语句
MySQL [test_db]> update innodb_lock set b='' where a = ;
然后第二个终端执行update语句
MySQL [test_db]> update innodb_lock set b = '' where a = ;
发现两条语句都执行成功了。因为修改的不是同一行数据。然后分别commit提交,再查看下数据,发现两行数据都发生了变化。
MySQL [test_db]> select * from innodb_lock;
+---+------+
| a | b |
+---+------+
| | b2 |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | b1 |
+---+------+
下面是重点,两个终端还是分别操作不同的行。
在第一个终端执行update操作
MySQL [test_db]> update innodb_lock set a = where b =; //注意这里的where条件b=4005。要记得当前表的b字段是字符串类型,并且加了索引,加了索引之后如果查询条件没加引号会导致失效
然后在第二个终端执行update操作
MySQL [test_db]> update innodb_lock set b='' where a = ; //发现被阻塞,行锁边表锁
一定要注意索引的合理利用!~~
Mysql在InnoDB引擎下索引失效行级锁变表锁案例的更多相关文章
- Mysql锁机制--索引失效导致行锁变表锁
Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...
- MySQL数据库InnoDB引擎下服务器断电数据恢复
说明: 线上的一台MySQL数据库服务器突然断电,造成系统故障无法启动,重新安装系统后,找到之前的MySQL数据库文件夹. 问题: 通过复制文件的方式对之前的MySQL数据库进行恢复,发现在程序调用时 ...
- MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据
记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...
- [MySQL]InnoDB引擎的行锁和表锁
1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描, 行锁则 ...
- mysql的innodb 引擎 表锁与行锁
innodb 引擎 行锁与表锁 行锁与表锁是基于索引来说的(且索引要生效) 不带索引 (表锁)要全表扫描 1. 执行select @@autocommit; 查看结果 0是不自动提交事务,1是自动提交 ...
- MySQL原理 - InnoDB引擎 - 行记录存储 - Off-page 列
本文基于 MySQL 8 在前面的两篇文章,我们分析了 MySQL InnoDB 引擎的两种行记录存储格式: Compact 格式 Redundant 格式 在这里简单总结下: Compact 格式结 ...
- mysql中InnoDB存储引擎的行锁和表锁
Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...
- Mysql InnoDB引擎下 事务的隔离级别
mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...
- MySQL数据库 InnoDB引擎 事务及行锁总结
一.事务 1.事务的四大特性 (1)原子性:事务开始后所有的操作要么一起成功,要么一起失败,整个事务是一个不可分割的整体. (2)一致性:是物开始前到结束后,数据库的完整性约束没有被破坏. (3)隔离 ...
随机推荐
- 初学hadoop,windows下安装
先bb一下,woc开始使用Cygwin来模拟linux配置hadoop,然后各种错误,找着找着发现原来2.0+的hadoop可以直接在windows下配置.当时真是1w头神兽飞过. 下载hadoop ...
- mysql 数据表读锁机制详解
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制.一.概述MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(tab ...
- WEB安全第三篇--控制请求的艺术:CSRF和SSRF
零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...
- 1.node.js下载
1.下载node.js http://nodejs.cn/ 2.下载git https://git-scm.com/download/win 3.安装npm npm install npm -g 使用 ...
- java启动3个线程轮流打印数字
转自:http://blog.csdn.net/u014011112/article/details/50988769 http://blog.csdn.net/perrywork/article/d ...
- angularJS中的MVC思想?
mvc 思想: 将应用程序的组成,划分为三个部分:model , controller 和 view ; - 控制器的作用是用来初始化模型用的: - 模型就是用于存储数据的: - 视图是展示数据的: ...
- Requested bean is currently in creation: Is there an unresolvable circular reference?
spring容器初始化报错:循环依赖,错误信息如下: Requested bean is currently in creation: Is there an unresolvable circula ...
- asp.net SessionState模式的配置及使用
由于项目dll文件变动比较频繁,而保存登陆的状态又保存在Session中,所以导致用户经常无故掉线(PS:dll变动的时候导致Session).有一种方法可以长期保存session,那就是sessio ...
- pta 习题集 5-5 最长连续递增子序列 (dp)
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8). 输入格式: 输入第1行给出正整数n ...
- 利用Python进行端口扫描
利用Python进行端口扫描 - Dahlhin - 博客园 https://www.cnblogs.com/dachenzi/p/8676104.html Python实现对一个网络段扫描及端口扫描 ...