MySQL锁机制八股整理
整理一下MySQL锁的八股,全文整理自二哥博客。 在MySQL数据库中,锁是用来协调多个进程或线程并发访问同一资源的机制。锁不仅保证了数据的一致性和有效性,而且是影响数据库并发访问性能的一个重要因素。 共享锁与排他锁 共享锁也叫 S(shared) 锁,允许多个事务进行读操作,阻塞写操作。 排他锁也叫 X(exclusive) 锁,只允许一个事务进行读写操作,阻塞其他事务的读写操作。 兼容性如下: 表锁与行锁 表锁:锁定整个表,资源开销小,加锁快,但并发度低,不会出现死锁,适合查询为主、少量更新的场景(如 MyISAM 引擎)。可以细分为表级S锁、表级X锁。 行锁:锁定单行或多行,开销大、加锁慢,可能出现死锁,但并发度高(InnoDB 默认支持)。可以细分为记录锁、间隙锁、临键锁,也可以分为共享锁和排他锁(与表级S锁、表级X锁一个意思,前提是行锁)。 表锁详细版: 表锁常见于 MyISAM 引擎, InnoDB 也可手动加锁,适合读多写少、全表扫描或者表结构变更的场景。 LOCK TABLES table_name READ; -- 显式加读锁 select... -- 其他会话可读,不可写 UNLOCK TABLES; -- 释放锁 LOCK TABLES table_name WRITE; -- 显式加写锁 INSERT/UPDATE/DELETE table_name; -- 其他会话读写均阻塞 UNLOCK TABLES; MyISAM 在执行 SELECT 时会自动加读锁,执行 INSERT/UPDATE/DELETE 时会加写锁。 对于 InnoDB 引擎,无索引的 UPDATE/DELETE 可能会导致锁升级为表锁。执行 ALTER TABLE 时会自动加表锁,阻塞所有读写操作。 行锁详细版: 行锁是 InnoDB 存储引擎中最细粒度的锁,它锁定表中的一行记录,允许其他事务访问表中的其他行。 底层是通过给索引加锁实现的,这就意味着只有通过索引条件检索数据时,InnoDB 才能使用行级锁,否则会退化为表锁。 ...