(三)MySQL锁问题---InnoDB(行锁演练)

MySQL锁问题–InnoDB(行锁演练)


(一)MySQL锁问题—MyISAM(表锁)


(二)MySQL锁问题—InnoDB(行锁理论)

本片文章主要是针对上篇关于行锁的演练部分,如果没有阅读行锁理论部分,可以参考行锁理论

行锁分类:

  1. 共享锁:允许一个事务去读一行,阻止其它事务获得相同数据的排它锁。
    命令:select * from table_name where … lock in share mode;
  2. 排它锁:允许获得排它锁的事务更新数据,阻止其它事务取得相同数据集的共享锁和排它锁。
    命令:select * from table_name where … for update;
    解释:是不是感觉共享锁和排它锁比较抽象,其实用大白话说共享锁就是读锁,排它锁就是写锁;和表所原理差不多,读锁可以多个共存,写锁排斥其它锁,需要等待。只不过表锁和行锁的区别就是一个锁定一行,一个锁定一张表

在这里插入图片描述

环境搭建

1.将事务自动提交关闭,使用命令 set autocommit=0(0关闭,1打开)
查看事务是否自动提交
事务自动提交是开启的,我们为了方便测试,需要关闭自动提交事务,否则我们看不到效果的

在这里插入图片描述

事务自动提交已经关闭。因为要测试事务并发情况,所以要开启两个回话,两个会话都需要这样设置

2 .创建带索引的表(因为行锁是根据索引实现的,这个在下一篇文章会细说)
在这里插入图片描述

在这里插入图片描述

为某行记录添加共享锁和排它锁演示

  1. A客户端给id为1的记录加共享锁
    在这里插入图片描述

2.B客户端也给id为1的记录加共享锁
在这里插入图片描述

3.给B客户端id为1的记录添加排它锁,结果阻塞
在这里插入图片描述

4.提交A客户端的事务,释放共享锁;再给A客户端Id为1的记录添加共享锁,给B客户端id为2的记录添加排它锁

在这里插入图片描述

在这里插入图片描述
这里就很好体现了行锁与表锁的区别,只要不是给同一条(索引)记录同时加共享锁和排它锁就不会出现阻塞,这也就提现了InnoDB并发高的地方,可以不同记录并发操作

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/85281202