mysql的innodb 引擎 表锁与行锁
innodb 引擎 行锁与表锁
行锁与表锁是基于索引来说的(且索引要生效)
不带索引 (表锁)要全表扫描
1. 执行select @@autocommit; 查看结果 0是不自动提交事务,1是自动提交事务, mysql默认是自动提交
2. set autocommit = 0;设置为不开启自动提交
3. 通过开多个tab窗口模拟不通的session 执行数据库
新建一张person表

窗口1 模拟第一个session

在此窗口先执行设置0,在单独执行update语句
窗口2 模拟第二个session

执行该条语句可以看到 sql一直执行 卡住了,因为它是在等待上一个事务执行完释放表锁
经过一段时间后看到如下结果

这个错跟我们生产上报的错一样,用pinpoint监控的
------------------------------------------------------

执行update 和insert 都是一样的结果 在等待表锁,虽然我操作的不是同一行数据。
如果我把窗口1的事务提交则窗口2会从卡的状态成功执行结束

窗口1的commit;

窗口2的session的则立马执行完毕,
这个场景模拟的是表锁,当session1 拿到表锁后,别的事务的session执行(insert,update,delete) 是拿不到锁的会进行锁等待。

通过命令 看到了当前处于等待的语句
把name字段添加索引(行锁)不用全表扫描直接定位到行 ,使用主键也是用的行锁

添加索引,然后通过执行计划查看索引是生效的
在回到之前的问题,窗口1 再次执行相同的sql 不提交事务,此时执行窗口2


窗口2 直接执行完毕,此时行锁生效,我操作的不是同一行,结果生效了
以上是innodb引擎的表锁 和行锁 ,顺便验证一下默认的事务隔离级别(读已提交的)
开一个窗口3 代表session3
事务执行前

删掉刚才的索引 drop index namex_name on person;
窗口1 执行,当前事务下的结果改变了

窗口3验证 窗口1的事务没提交前 别的事务是读不到这个事务的,如果把窗口1的事务提交 怎窗口3能顺利读取, 这同时说明了2个隔离级别 -----------读已提交的 和不可重读
事务的可串行化可参考:https://blog.csdn.net/nangeali/article/details/75578787 事务内的查询都是带锁的(表锁)

表锁与行锁 以上自己通过数据库执行 直观的验证了一遍,可以看如下这边文章的文字描述来抽象这个验证
参考:https://blog.csdn.net/lz710117239/article/details/71762617
https://blog.csdn.net/u014635472/article/details/79712931 或者 https://www.cnblogs.com/wodebudong/articles/7976474.html
总结: 普通的 曾删改 是表锁,加入索引的曾删改 是行锁,执行 查询是不加任何锁的, 不是有些博客所说的 表锁升级为行锁 。
mysql的innodb 引擎 表锁与行锁的更多相关文章
- Mysql在InnoDB引擎下索引失效行级锁变表锁案例
先做好准备,创建InnoDB引擎数据表,并添加了相应的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...
- 三分钟入门 InnoDB 存储引擎中的表锁和行锁
各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...
- MySQL中的锁(表锁、行锁)
锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...
- Mysql表锁、行锁、页锁
参考 http://www.jb51.net/article/50047.htm <MySQL行级锁.表级锁.页级锁详细介绍> 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住 ...
- [转]MySQL 表锁和行锁机制
本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...
- MySQL 全局锁、表锁以及行锁
1. 系统版本 MySQL 5.7.25 ubuntu 16.04 2. 全局锁 全局锁即对整个数据库实例加锁,使得整个库处于只读状态,会阻塞DML和DDL语句.使用如下命令(简称FTWRL)可为数据 ...
- MySQL表锁和行锁
锁粒度 MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现: InnoDB 存储引擎既支持行级锁(row-level locki ...
- MySql中的锁(表锁,行锁)
锁是计算机协调多个进程或春线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU,RAM,I/O)的争用之外,数据也是一种工许多用户共享的资源.如何保证数据并发访问的一致性,有效性是所有数据 ...
- MySQL的中的全局锁、表级锁、行锁
MySQL的中的全局锁.表级锁.行锁 学习极客时间-林晓彬老师-MySQL实战45讲 学习整理 全局锁 对整个数据库实例加锁.通过使用Flush tables with read lock (FTWR ...
随机推荐
- xor or and 线段树
每一位维护一颗线段树 (-1)^1 =-2 (-2)^1=-1 #include <cstdio> #include<iostream> using namespace std ...
- Iterator(遍历器) 和 for...of 循环
是generator的前置知识 generator :https://www.cnblogs.com/wangtong111/p/11322961.html 遍历器(Iterator)就是这样一种机制 ...
- (转)搭建自己的Nuget服务器
转:https://www.cnblogs.com/knowledgesea/p/5500954.html 序言 你们公司有没有好多项目,有没有好多类库,你们的类库是在tfs中管理,还是svn或者gi ...
- linux下面用Mingw编译libx264
linux下面用Mingw编译libx264 首先要先安装好mingw 我用的是Ubuntu 编译ffmpeg的时候 ,官方上面有一个自动化脚本能够把mingw安装好 这里就不说了 新版本的libx2 ...
- 四十三、jenkins启动时报错:consider increasing the maximum size of the cache. After eviction approximately [10,239] KB of data
jenkins启动时报错: consider increasing the maximum size of the cache. After eviction approximately [10,23 ...
- 以非root身份安装Python的Module或者Package以及pip安装指定路径
因为要远程访问公司的服务器,没有sudo的权限,所以在安装python的一些包的时候就不能安去默认路径了(比如以/usr/local/lib/为prefix的路径). 一般来讲用easy_instal ...
- cocos2dx基础篇(10) 按钮控件CCControlButton
[3.x] (1)去掉 “CC” (2)对象类 CCObject 改为 Ref (3)按钮事件回调依旧为 cccontrol_selector ,没有使用 CC_CALLBACK_2 (4)按钮状态 ...
- Discrete Mathematics and Its Applications | 1 CHAPTER The Foundations: Logic and Proofs | 1.1 Propositional Logic
propositional variables (or statement variables), letters used for propositional variables are p, q, ...
- mybatis使用map传递多参数报错:A query was run and no Result Maps were found for the Mapped Statement
在使用mybatis进行多参数传递时,报错: A query was run and no Result Maps were found for the Mapped Statement 'xx.xx ...
- 递归法求组合数C(m,n)
假设这样一个数组: 1 2 3 4 5 n=5 若 m=3 也就是要求C(3,5) 首先先选第一个数 1 那么剩下的工作就是在2-5之间选择2个数 如果我们没有选择第一个数 选第二个数2 那么剩下的工 ...