我们说对于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: