Mysql数据库锁模块之MyISAM与InnoDB关于锁方面的区别

MyISAM与InnoDB关于锁方面的区别是什么?

MyISAM默认用的是表级锁,不支持行级锁
InnoDB默认用的是行级锁,也支持表级锁
注:MyISAM与InnoDB存储引擎都是针对某张具体表而言的,而非数据库级别的

MyISAM表级锁

首先准备两个数据库的session(会话),这里用sessionA和sessionB来表示,来对同一张表进行操作

先上读锁(默认共享锁)情况:

首先sessionA先去执行一个select查询操作:

情况1:此时sessionB去执行一个更改数据(增、删、改)的操作,会发现sessionA的查询操作未执行完之前,sessionB的更改操作是等待状态,无法执行的(不再支持上排它锁

在这里插入图片描述

情况2:此时sessionB去执行一个select查询操作,会发现sessionA的查询操作未执行完之前,sessionB的查询操作是不受影响的,独立执行的,这就是为什么读锁也叫默认共享锁(支持上其他共享锁
在这里插入图片描述

先上写锁(排他锁)情况:

首先sessionA先去执行一个select查询操作:

此时sessionB去执行一个查询操作或者更改数据(增、删、改)的操作,会发现sessionA的查询操作未执行完之前,sessionB的操作是等待状态,无法执行的(不再支持上其他锁
在这里插入图片描述

显示的手动对一个表的读操作加读锁、释放锁:

加读/写锁:lock tables 表名 read/write;
释放锁:unlock tables;
InnoDB行级锁

首先InnoDB采用的是二段锁
二段锁:加锁和解锁是分别来执行的,对一个事务里的一批sql操作加锁,等到事务提交的时候,再进行所有解锁

要演示这个先将两个session的事务自动提交关闭

show variables like 'autocommit';#查看当前是否开启自动提交事务,默认开启
set autocommit = 0;#关闭默认提交,关闭之后,事务需要手动commit,并且设置只对当前session有效
commit;#提交事务

演示InnoDB为行级锁,sessionA和sessionB就对同一张表的同一行进行操作

先对sessionA执行select操作,但是不commit,然后对sessionB进行update/insert/delete操作,发现sessionB竟然能够执行成功,这不符合在行级别加了共享锁之后,不能再加排它锁的规律,其实这里需要注意,这里sessionA的select操作并未加共享读锁,这是InnoDB对select进行了优化(非阻塞select),这里需要显示的加上共享读锁

select......lock in share mode;//加共享锁

此时再对sessionA执行select操作,但是不commit,然后对sessionB进行update/insert/delete操作,发现sessionB不能够执行需要等待,当sessionA执行commit之后,释放锁,此时sessionB方可执行
在这里插入图片描述
如果sessionA和sessionB操作的是不同行,不论sessionA是加的共享锁还是排它锁,都不影响sessionB的独立操作,因此也证明InnoDB默认行级锁

InnoDB中其他锁情况和MyISAM中也符合相同规律,不同的就是InnoDB默认行级别,MyISAM有且只有表级别

InnoDB在什么情况下行锁会升级为表锁?

当操作sql没有走索引(没有走索引或者索引失效),此时就会走表锁,两个数据库session分别操作同一张表中不同的数据行,还是会受共享锁和排它锁之间兼容性的限制

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值