跳到主要内容

optimization_locking

概述

MySQL使用锁来管理针对表内容的连接:

  • 内部锁:MySQL服务器内部自行使用内部锁来管理多线程创建的和表内容相关的连接;
  • 外部锁:服务器|其他应用程序锁定表文件来控制哪个程序可以在何时访问表。

内部锁

行级锁

多会话,高并发,联机事务处理时MySQL会用到行级锁。它会锁定需要的那几行,而其他的行还可以同时进行操作。

行级锁的优点:

  • 不同的会话访问不同的行时会更少的锁冲突
  • 回滚时更少的修改
  • 可以长时间锁定单行

表级锁

只有一个会话可以同时对表进行更新。 表级锁的优点:

  • 更少的内存要求
  • 更快的查询表中绝大多数数据:只有一个锁被引用

InnoDB 的表使用行级锁,所有多个会话和应用可以同时读|写同一张表而不会产生不一致的问题。这个存储引擎不要使用表级锁,因为它徒劳无益,反而影响并发。 MySQL默认使用InnoDB存储引擎。

其他的存储引擎则是使用表级锁。使用表级锁的场景是:频繁的查询,很少的插入和更新。

表级锁的缺点是:表级锁可以让多个会话同时读数据,但是如果有一个会话要写数据,它必须先得到写权限,这意味着它要等其他的会话完成对该表的操作,而它对表操作时,其他会话也只能等待。

元数据锁

为了确保事务的串行化,MySQL必须不允许一个会话在其他会话还有未完成事务时执行DDL。服务器通过元数据锁来实现。元数据锁避免了表结构的改变。

外部锁

外部锁的可以让外部程序互斥的访问数据库表文件。 不详述。


参考文档:MySQL官方文档