MySQL锁知识点总结

MySQL锁知识点总结

概述

数据库锁是数据库管理系统中用于控制并发访问的机制。在MySQL中,锁机制直接影响事务的隔离级别和并发性能。本文总结了MySQL中常见的锁知识点。

锁的分类

1. 按粒度划分

  • 表级锁:锁定整个表,开销小,并发度低
  • 行级锁:锁定单行记录,开销大,并发度高
  • 页级锁:锁定数据页,介于表级和行级之间

2. 按模式划分

  • 共享锁(S锁):允许事务读取数据,多个事务可以同时持有
  • 排他锁(X锁):允许事务修改数据,其他事务不能同时持有

3. 意向锁

  • 意向共享锁(IS):事务意图在某些行上设置共享锁
  • 意向排他锁(IX):事务意图在某些行上设置排他锁

InnoDB锁机制

行锁

InnoDB存储引擎支持行级锁,通过索引实现:

  • Record Lock:锁定索引记录
  • Gap Lock:锁定索引间隙,防止幻读
  • Next-Key Lock:Record Lock + Gap Lock的组合

锁等待与死锁

  • 锁等待:当事务请求的锁被其他事务持有时,需要等待
  • 死锁:两个或多个事务相互等待对方释放锁

锁与事务隔离级别

隔离级别 锁机制
READ UNCOMMITTED 无锁
READ COMMITTED 记录锁
REPEATABLE READ Next-Key Lock
SERIALIZABLE 间隙锁+表锁

常见问题

1. 死锁的预防

  • 尽量使用索引,避免全表扫描
  • 保持事务简短,减少持有锁的时间
  • 统一访问顺序

2. 锁监控

1
2
3
4
5
6
7
8
-- 查看当前事务
SELECT * FROM information_schema.INNODB_TRX;

-- 查看当前锁
SELECT * FROM information_schema.INNODB_LOCKS;

-- 查看锁等待
SELECT * FROM information_schema.INNODB_LOCK_WAITS;

总结

理解MySQL锁机制对于优化数据库性能和避免并发问题至关重要。在实际开发中,需要根据业务场景选择合适的锁策略,合理设计索引,避免长时间持有锁导致的性能问题。