简单了解Innodb引擎如何加行锁
我们说对于MYSQL加锁一般是说Innodb加锁,因为一定版本号后的MySQL默认的存储引擎就是Innodb,我们可以先来看看Innodb和MyISAM的区别
Innodb | MyISAM | |
---|---|---|
事务 | √ | × |
行锁 | √ | × |
索引 | 索引和数据耦合在一起 | 索引和数据分开存储,对于所有索引都是二级索引 |
文件 | .frm表结构文件、.ibd数据文件 | .frm表结构文件、.myd数据文件、.myi索引文件 |
MySQL有三种锁:全局锁、表级锁、行级锁,对于行锁又有以下三种:
- 记录锁 Record Lock:单点区域,读写互斥
- 间隙锁 Gap Lock:左开右开区域,读写不互斥
- 临键锁 Record Lock:左开右闭区域,读写互斥
对于不同的隔离级别,锁也会有所区别,比如在读已提交的隔离级别,只有记录锁,到了可重复读的隔离级别,才会有间隙锁以及临键锁
对于行锁来说,事务提交才会释放锁
如何加行锁?
Innodb引擎加行锁都是加在索引上的,如果没有索引条件,默认会锁住全表(相当于锁在了其它索引或者那个隐藏的id索引)
如何避免锁住全表呢?
- 写SQL语句的时候使用where加上索引条件
- 使用limit限制查询的条数
哪些语句可以加锁呢?
- select:
- 普通的select:无锁
- select in share mode:共享锁
- select for update:独占锁
- update:
- insert:
- delete:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 白兰!