读锁(共享锁,Shared Lock)
读锁是一种共享锁,用于读取数据时的并发控制。它的主要特点包括:
示例:
SELECT * FROM table_name WHERE id = 1 FOR SHARE;这条 SQL 语句会在查询时为指定行加共享锁,允许其他读操作,但阻止写操作。
写锁(排他锁,Exclusive Lock)
写锁是一种排他锁,用于写操作(如更新、删除或插入)时的并发控制。它的主要特点包括:
示例:
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;这条 SQL 语句会在查询时为指定行加排他锁,阻止其他事务对该行的读写操作。
行锁(Row-Level Lock)
行锁是 MySQL 中最细粒度的锁,用于锁定表中的单行或多行数据。它的主要特点包括:
示例:
UPDATE table_name SET column = value WHERE id = 1;在 InnoDB 存储引擎中,这条语句会锁定 id = 1 的行。
表锁(Table-Level Lock)
表锁是 MySQL 中较粗粒度的锁,用于锁定整个表。它的主要特点包括:
示例:
LOCK TABLES table_name WRITE;这条语句会锁定整个表,阻止其他事务对该表的读写操作。
乐观锁(Optimistic Lock)
乐观锁是一种并发控制机制,基于假设大多数情况下数据不会发生冲突。它的主要特点包括:
version 字段)或时间戳来检测数据是否被修改。示例:
UPDATE table_name SET column = value, version = version + 1 WHERE id = 1 AND version = @currentVersion;如果更新失败(即没有行被更新),则表示数据已被其他事务修改。
悲观锁(Pessimistic Lock)
悲观锁是一种并发控制机制,基于假设冲突经常发生。它的主要特点包括:
FOR UPDATE)来防止其他事务修改数据。示例:
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;这条语句会在查询时为指定行加排他锁,确保后续操作的原子性。
意向锁(Intention Locks)
意向锁是 InnoDB 存储引擎中的一种锁,用于表示事务对表中某些行的锁定意图。它的主要类型包括:
意向锁的主要作用是优化锁的管理,减少锁冲突。
间隙锁(Gap Lock)
间隙锁是 InnoDB 存储引擎中的一种锁,用于锁定索引记录之间的“间隙”。它的主要特点包括:
REPEATABLE READ 或 SERIALIZABLE 时使用。示例:
SELECT * FROM table_name WHERE column > 10 FOR UPDATE;这条语句会锁定满足条件的记录以及这些记录之间的间隙。
临键锁(Next-Key Lock)
临键锁是间隙锁和行锁的组合,用于锁定记录及其后面的间隙。它的主要作用是防止幻读。
示例:
SELECT * FROM table_name WHERE column = 10 FOR UPDATE;这条语句会锁定 column = 10 的记录以及其后面的间隙。
MySQL 提供了多种锁机制,每种锁类型适用于不同的场景。开发者可以根据实际需求选择合适的锁类型,以优化数据库的并发性能和数据一致性。以下是锁类型的简单对比:
<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
锁类型 | 特点 | 适用场景 |
|---|---|---|
读锁 | 共享锁,允许并发读 | 高并发读操作 |
写锁 | 排他锁,阻止并发读写 | 数据修改操作 |
行锁 | 细粒度锁,锁定单行或多行 | 高并发事务操作 |
表锁 | 粗粒度锁,锁定整个表 | 批量操作或全表操作 |
乐观锁 | 基于版本号或时间戳 | 冲突较少的场景 |
悲观锁 | 基于显式加锁 | 冲突较多的场景 |
意向锁 | 表示锁定意图 | 优化锁管理 |
间隙锁 | 锁定索引记录之间的间隙 | 防止幻读 |
临键锁 | 锁定记录及其后面的间隙 | 防止幻读 |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。