本文共 1319 字,大约阅读时间需要 4 分钟。
锁是协调多个进程或线程并发访问某一资源的机制,用于避免资源争抢。数据库中的锁可用于解决并发访问引起的数据一致性问题,如防止脏读、不可重复读等。锁机制对数据库性能也有重要影响,因此需要根据具体应用需求选择合适的锁类型。
根据锁的粒度和作用类型,锁可以分为以下几种:
MySQL的锁机制因存储引擎不同而有所差异,主要包括以下表锁类型:
| 存储引擎 | 表锁支持 | 行锁支持 | 页面锁支持 |
|---|---|---|---|
| MyISAM | 支持 | 不支持 | 不支持 |
| InnoDB | 支持 | 支持 | 不支持 |
| MEMORY | 支持 | 不支持 | 不支持 |
| BDB | 支持 | 不支持 | 支持 |
| 锁类型 | 特点 |
|---|---|
| 表锁 | 偏向MyISAM,开销小,加锁快,不会导致死锁,锁定粒度大。 |
| 行锁 | 偏向InnoDB,开销大,加锁慢,可能导致死锁,锁定粒度最小。 |
| 页面锁 | 开销和加锁时间介于表锁和行锁之间,锁定粒度介于两者之间。 |
MyISAM默认支持表锁,不支持行锁。它会在执行SELECT时自动加读锁,在执行UPDATE、DELETE、INSERT时自动加写锁。
加读锁:lock table table_name read;加写锁:lock table table_name write;
InnoDB默认支持行锁,其特点为:
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODESELECT * FROM table_name WHERE ... FOR UPDATEInnoDB在使用范围条件时,会为不存在的记录加锁,这称为间隙锁(Next-Key锁)。例如,对于id < 10的查询,InnoDB会锁定所有id小于10的记录以及id=10的记录。
使用SHOW OPEN TABLES 查看当前锁状态:
mysql> SHOW OPEN TABLES;
使用SHOW STATUS LIKE 'Table_locks%'; 查看锁争用情况:
mysql> SHOW STATUS LIKE 'Table_locks%';
锁机制是数据库并发管理的核心。选择合适的锁类型需要综合考虑应用场景和性能需求。MyISAM的表锁适合读为主的应用,而InnoDB的行锁则更适合高并发和高一致性的场景。
转载地址:http://ohdfk.baihongyu.com/