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
总结: 普通的 曾删改 是表锁,加入索引的曾删改 是行锁,执行 查询是不加任何锁的, 不是有些博客所说的 表锁升级为行锁 。
最新文章
- 关于java的递归写法,经典的Fibonacci数的问题
- jquery ui bootstrap日期插件
- Env:Winmanager插件使用
- jstring 和char 之间的转换方法
- [BZOJ 1029] [JSOI2007] 建筑抢修 【贪心】
- C#基础知识-XML介绍及基本操作(十)
- for循环中执行setTimeout问题
- Nginx 如何设置反向代理 多服务器,配置区分开来,单独文件保存单个服务器 server 主机名配置,通过 include 实现
- IntelliJ IDEA使用笔记
- easyui,文件引用
- C程序第三次作业
- 【51nod】1239 欧拉函数之和 杜教筛
- 菜鸟教程之工具使用(九)——Git如何进行分支的merge操作
- 【Hadoop学习之五】win7+Eclipse+hadoop3搭建本机开发环境
- FastDFS集群安装
- unlink与close关系
- 【Python】使用Pytest集成Allure生成漂亮的图形测试报告
- bzoj 1085骑士精神 迭代深搜
- 基于规则的中文分词 - NLP中文篇
- RSA前端加密解密
热门文章
- redis 安装 主从同步 哨兵模式
- Burp suite抓取HTTPS请求
- android api文档:intent阅读笔记
- tomcat简单性能优化
- virt-manager 使用 shh 远程访问配置方法
- React Native商城项目实战01 - 初始化设置
- 三、Appium-python-UI自动化之元素定位uiautomatorviewer
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
- eclipse添加约束文件
- 中国MOOC_零基础学Java语言_第2周 判断_2信号报告