MySQL中,不同的存储引擎对增删改查操作使用的锁类型有所不同。以下介绍 InnoDB 和 MyISAM 两种常用存储引擎的锁机制:
InnoDB 存储引擎
InnoDB 存储引擎使用多版本并发控制 (MVCC) 来实现锁机制。MVCC 的核心思想是为每个数据行维护多个版本,每个版本都有一个时间戳。当一个事务对数据进行修改时,会创建一个新的数据版本,并将其时间戳设置为当前时间戳。旧版本的数据仍然保留,其他事务仍然可以读取旧版本的数据。
InnoDB 存储引擎使用以下类型的锁:
行级锁:行级锁是 InnoDB 存储引擎默认的行锁模式,也被称为写锁。当一个事务对某行数据加上了行级锁后,其他事务就无法对该行数据进行任何操作,包括读取和修改。只有持有该行排他锁的事务才可以对该行数据进行读写操作。
InnoDB 存储引擎的行级锁可以进一步细分为以下两种类型:
* **记录锁**:记录锁锁定的是数据行的具体记录。
* **间隙锁**:间隙锁锁定的是某个范围内的记录。
表级锁:表级锁是 InnoDB 存储引擎支持的一种锁类型,也被称为写锁。当一个事务对某个表加上了表级排他锁后,其他事务就无法对该表进行任何操作,包括读取和修改。只有持有该表排他锁的事务才可以对该表进行读写操作。
意向锁:意向锁是 InnoDB 存储引擎特有的一种锁类型,用于表示一个事务准备对某张表加排他锁。当一个事务对某张表加上了意向排他锁后,其他事务就不能再对该表加共享锁。但是,其他事务仍然可以对该表加排他锁。
全局锁:全局锁是 MySQL 服务器的一种锁类型,也被称为超级锁。当一个事务对整个数据库加上了全局排他锁后,其他事务就无法对该数据库进行任何操作,包括连接数据库。
MyISAM 存储引擎
MyISAM 存储引擎使用表级锁来实现锁机制。当一个事务对某个表进行增删改操作时,会对该表加锁,阻止其他事务对该表进行任何操作。只有等到第一个事务提交或回滚后,表锁才会被释放。
MyISAM 存储引擎还使用以下类型的锁:
读锁:读锁允许其他事务读取被锁定的表,但不能修改。
写锁:写锁不允许其他事务读取或修改被锁定的表。
增删改查操作使用的锁
以下表格总结了 InnoDB 和 MyISAM 两种存储引擎中,增删改查操作使用的锁类型:
操作InnoDBMyISAM
SELECT行级共享锁表级共享锁
INSERT行级排他锁表级排他锁
UPDATE行级排他锁表级排他锁
DELETE行级排他锁表级排他锁
需要注意的是,
以上表格仅列出了基本的锁类型,实际的锁情况可能会更加复杂。
InnoDB 存储引擎的 MVCC 机制会使锁的实际情况更加复杂。