表锁(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 存储引擎。