在 MySQL 中,锁机制用于管理并发操作,确保数据的一致性和完整性。常见的锁类型包括:
1. 全局锁
- FLUSH TABLES WITH READ LOCK (FTWRL):锁定整个数据库实例,禁止写操作,通常用于备份。
- 全局读锁:允许所有会话读数据,但禁止写操作。
2. 表级锁
- 表锁:
- 表共享锁 (Table Read Lock):允许多个会话同时读,但禁止写。
- 表独占锁 (Table Write Lock):禁止其他会话读写。
- 元数据锁 (MDL):防止表结构被修改,通常在执行 DDL 语句时自动加锁。
3. 行级锁
- 共享锁 (S Lock):允许多个事务同时读同一行,但禁止写。
- 排他锁 (X Lock):禁止其他事务读写该行。
- 记录锁 (Record Lock):锁定索引记录。
- 间隙锁 (Gap Lock):锁定索引记录之间的间隙,防止插入。
- 临键锁 (Next-Key Lock):结合记录锁和间隙锁,锁定记录及其前后间隙。
4. 意向锁
- 意向共享锁 (IS Lock):表示事务打算在表中的某些行上加共享锁。
- 意向排他锁 (IX Lock):表示事务打算在表中的某些行上加排他锁。
5. 自增锁 (AUTO-INC Lock)
- 用于自增列,确保插入操作时自增值的唯一性。
6. 死锁
- 当多个事务相互等待对方释放锁时,形成死锁。MySQL 会自动检测并终止其中一个事务。
7. 乐观锁与悲观锁
- 乐观锁:假设冲突少,通常在提交时检查版本号或时间戳。
- 悲观锁:假设冲突多,操作前先加锁。
8. 死锁检测与处理
- MySQL 会自动检测死锁并终止其中一个事务。
9. 锁的粒度
- 行锁:锁定单行,并发度高。
- 页锁:锁定数据页,介于行锁和表锁之间。
- 表锁:锁定整个表,并发度低。
10. 锁的兼容性
- 共享锁与共享锁兼容,共享锁与排他锁不兼容,排他锁与排他锁不兼容。
11. 锁的释放
- 事务提交或回滚时释放锁。
12. 锁的等待与超时
- 事务等待锁时可能超时,超时后返回错误。
13. 锁的监控
- 使用
SHOW ENGINE INNODB STATUS
或information_schema.INNODB_LOCKS
监控锁状态。
14. 锁的优化
- 通过合理设计索引、减少事务大小、使用低隔离级别等方式优化锁的使用。
15. 锁的隔离级别
- 读未提交 (Read Uncommitted):最低级别,可能读到未提交数据。
- 读已提交 (Read Committed):只能读到已提交数据。
- 可重复读 (Repeatable Read):确保事务内多次读取结果一致。
- 串行化 (Serializable):最高级别,完全串行执行。
这些锁类型帮助 MySQL 在不同场景下管理并发操作,确保数据一致性。
THE END
暂无评论内容