首页 技术 正文
技术 2022年11月12日
0 收藏 718 点赞 2,899 浏览 1277 个字

 innodb 引擎 行锁与表锁
 行锁与表锁是基于索引来说的(且索引要生效)

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

mysql的innodb 引擎 表锁与行锁

  窗口1 模拟第一个session

mysql的innodb 引擎 表锁与行锁

在此窗口先执行设置0,在单独执行update语句

窗口2 模拟第二个session

mysql的innodb 引擎 表锁与行锁

执行该条语句可以看到 sql一直执行 卡住了,因为它是在等待上一个事务执行完释放表锁

经过一段时间后看到如下结果

mysql的innodb 引擎 表锁与行锁

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

——————————————————

mysql的innodb 引擎 表锁与行锁

  执行update 和insert 都是一样的结果 在等待表锁,虽然我操作的不是同一行数据。

  如果我把窗口1的事务提交则窗口2会从卡的状态成功执行结束

mysql的innodb 引擎 表锁与行锁

窗口1的commit;

mysql的innodb 引擎 表锁与行锁

窗口2的session的则立马执行完毕,

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

mysql的innodb 引擎 表锁与行锁

  通过命令 看到了当前处于等待的语句

  把name字段添加索引(行锁)不用全表扫描直接定位到行 ,使用主键也是用的行锁

mysql的innodb 引擎 表锁与行锁

添加索引,然后通过执行计划查看索引是生效的

在回到之前的问题,窗口1 再次执行相同的sql 不提交事务,此时执行窗口2

   mysql的innodb 引擎 表锁与行锁

mysql的innodb 引擎 表锁与行锁

窗口2 直接执行完毕,此时行锁生效,我操作的不是同一行,结果生效了

 以上是innodb引擎的表锁 和行锁 ,顺便验证一下默认的事务隔离级别(读已提交的)

开一个窗口3 代表session3

事务执行前

mysql的innodb 引擎 表锁与行锁

删掉刚才的索引  drop  index namex_name on person;

窗口1 执行,当前事务下的结果改变了

mysql的innodb 引擎 表锁与行锁

窗口3验证   窗口1的事务没提交前 别的事务是读不到这个事务的,如果把窗口1的事务提交  怎窗口3能顺利读取, 这同时说明了2个隔离级别  ———–读已提交的 和不可重读

事务的可串行化可参考:https://blog.csdn.net/nangeali/article/details/75578787  事务内的查询都是带锁的(表锁)

mysql的innodb 引擎 表锁与行锁

  表锁与行锁  以上自己通过数据库执行 直观的验证了一遍,可以看如下这边文章的文字描述来抽象这个验证

参考:https://blog.csdn.net/lz710117239/article/details/71762617

    https://blog.csdn.net/u014635472/article/details/79712931 或者 https://www.cnblogs.com/wodebudong/articles/7976474.html

  

总结:   普通的 曾删改  是表锁,加入索引的曾删改 是行锁,执行 查询是不加任何锁的, 不是有些博客所说的 表锁升级为行锁 。

上一篇: JavaScript回顾
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,116
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,588
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,433
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,204
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,840
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,925