表锁(Table Lock)
作用
锁定整个表:当一个表被表锁锁定时,其他线程不能对该表进行任何操作,直到锁被释放。
特点
粒度大:表锁的粒度较大,锁定整个表,因此开销较低,但并发性能较差。
应用场景:适用于以读操作为主、少量写操作的场景,例如数据仓库、报表查询等。
例子
共享锁(读锁):允许多个线程同时读取表,但不允许写操作。
LOCK TABLES table_name READ;
排他锁(写锁):仅允许一个线程对表进行读写操作,其他线程需等待。
LOCK TABLES table_name WRITE;
行锁(Row Lock)
作用
锁定单行记录:行锁仅锁定涉及的行,不影响其他行的操作。
特点
粒度小:行锁的粒度较小,开销较高,但并发性能好。
应用场景:适用于并发写操作较多的场景,例如在线交易系统。
实现
InnoDB 存储引擎实现行级锁。
默认情况下,InnoDB 自动使用行锁,除非 SQL 语句中没有使用索引,导致 InnoDB 自动回退为表锁。
例子
行级锁由 InnoDB 自动处理,例如在以下 SQL 语句中:
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
页锁(Page Lock)
作用
锁定数据页:页锁锁定包含被操作记录的整个数据页。
特点
粒度介于表锁和行锁之间:页锁的粒度在表锁和行锁之间,开销和并发性能也介于两者之间。
应用场景:主要用于 BDB 存储引擎,较少在其他场景中使用。
例子
页锁主要在 BDB 存储引擎中使用,例如以下 SQL 语句:
SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;
总结
表锁(Table Lock):锁定整个表,开销低但并发性能差,适用于读多写少的场景。
行锁(Row Lock):锁定单行记录,开销高但并发性能好,适用于并发写操作较多的场景,主要由 InnoDB 存储引擎实现。
页锁(Page Lock):锁定数据页,开销和并发性能介于表锁和行锁之间,主要用于 BDB 存储引擎。