在MySQL中,常见的锁可以分为两大类:表级锁和行级锁。除此之外,还有一些其他的锁类型,具体如下:
-
表级锁(Table-level locks):
- 表锁(Table Locks): 锁定整个表,是最粗粒度的锁。包括读锁和写锁。读锁允许多个事务同时获取读锁,但不允许写锁和其他写锁并存。写锁则要求独占,不允许其他事务获取读锁和写锁。
- 全局锁(Global Locks): 对整个数据库实例加锁,限制整个数据库的读写操作。通常用于执行全库备份等场景。
-
行级锁(Row-level locks):
- 共享锁(Shared Locks): 多个事务可以同时持有相同行的共享锁,用于读取操作,不阻塞其他事务的共享锁。
- 排它锁(Exclusive Locks): 只允许一个事务持有排它锁,用于写入操作,其他事务不能同时持有共享锁或排它锁。
-
页级锁(Page-level locks):
- 将表按页(通常是数据页大小,如InnoDB中的16KB)进行划分,锁定整个数据页。开销和加锁时间介于表锁和行锁之间。
-
意向锁(Intention Locks):
- 表示一个事务准备在某一层级上加哪种类型的锁,包括意向共享锁和意向排它锁。用于辅助数据库管理系统判断事务之间的锁关系,从而避免死锁。
-
自增锁(Auto-increment Locks):
- 当多个事务同时插入数据到自增列的表时,会使用自增锁,保证生成的自增值是唯一的。
-
间隙锁(Gap Locks):
- 用于锁定一个范围而不是具体的行,防止其他事务在这个范围插入新行,用于防止幻读的发生。
这些锁在MySQL中的实现依赖于存储引擎的不同,例如InnoDB和MyISAM在处理锁的方式上有很大的差异。 InnoDB通常使用行级锁,而MyISAM更倾向于使用表级锁。