欢迎来到之路教程(on itroad-com)

元数据锁

这是 MySQL 5.5.3 的新锁类型。
在事务内部时,MySQL 不允许在活动事务中使用的表上使用数据定义语言 (DDL) 语句。
有关更多详细信息,另请参阅事务中的元数据锁定。

全局读锁

'FLUSH TABLES WITH READ LOCK' 语句获取全局读锁。
这在所有表都被锁定的意义上类似于表锁,但与 LOCK TABLES 不同的是,它可以启动一个事务并且可以插入到日志表中。

外部锁

外部锁是一项可与 MyISAM 存储引擎一起使用的功能,以允许多个进程访问相同的 MyISAM 表,例如,如果我们在 MySQL 服务器运行时使用 myisamchk。
可以在服务器启动时使用 -external-locking 或者 -skip-external-locking 选项控制外部锁定的使用。

表级锁

当查询访问表或者表中的数据时,表级锁是 MySQL 中的默认锁级别。
此锁级别是 MyISAM 存储引擎支持的唯一锁级别。
'LOCK TABLES' 和 'FLUSH TABLES tbl_name [, tbl_name] ... WITH READ LOCK' 等语句也获取表级锁(注意 FLUSH TABLES tbl_name [, tbl_name] ... WITH READ LOCK 也获取元数据锁)。

可以使用以下状态变量监视表锁:

  • Com_lock_tables :显式 LOCK TABLES 语句的数量。
  • Com_unlock_tables :显式 UNLOCK TABLES 语句的数量。
  • Table_locks_immediate :立即授予表锁的次数。
  • Table_locks_waited :请求表锁但连接必须等待锁的次数。

上述状态变量在全局和会话级别均可用。

并发插入

MyISAM 支持称为“并发插入”的概念。
这意味着即使表上有共享锁,也可以向表中插入行。
并发插入由 concurrent_insert 选项控制,该选项可以具有三个值:

  • 0 或者 NEVER :永远不允许并发插入。
  • 1 或者 AUTO :如果 MyISAM 表中没有空洞(来自删除),则允许并发插入。这是默认设置。
  • 2 或者 ALWAYS :行将始终插入表的末尾,即使对于有孔的表也允许并发插入。
MySQL 服务器中有哪些锁

MySQL 在多个级别使用锁定,其中表级锁和行级锁是最常遇到的两种锁类型。
对于每种锁类型,持有的锁通常可以是共享锁或者排他锁。
共享允许多个进程读取相同的数据,但写入会阻塞。
排他锁将阻止读取和写入。

如果查询正在等待锁定,在某些情况下可以从“SHOW PROCESSLIST”输出的“状态”列中看到。
下面介绍各种锁类型。

行级锁

InnoDB 和 NDB(集群)存储引擎将尽可能使用行级锁而不是表级锁。
这意味着只有实际接触(读取、插入或者更新)的行才会被锁定,而不是整个表。
这有助于存档更高的并发性,但它也会引入死锁,因为在执行查询之前无法计算必要的锁。
请注意,对于 InnoDB,事务隔离级别也会影响锁定哪些行。
有关表级锁和行级锁的比较,另请参见内部锁定方法。

日期:2020-09-17 00:11:16 来源:oir作者:oir