mysql锁 | 青训营

67 阅读2分钟

在 MySQL 中,不同的语句可能会触发不同类型的锁。以下是一些常见的 MySQL 语句及其可能触发的锁类型:

  1. SELECT 语句:通常不会触发锁,除非使用了特定的锁定选项。默认情况下,SELECT 语句只会获取读取锁(Shared Lock),允许其他会话同时读取相同的数据。

  2. INSERT 语句:在执行 INSERT 语句时,MySQL 会获取写入锁(Exclusive Lock),以保证在插入新数据时的数据一致性。这意味着其他会话无法同时插入相同的数据,但其他会话可以读取已存在的数据。

  3. UPDATE 语句:执行 UPDATE 语句时,MySQL 会获取写入锁,以确保在更新数据时的数据一致性。与 INSERT 一样,这会阻止其他会话同时更新相同的数据,但其他会话可以读取已存在的数据。

  4. DELETE 语句:在执行 DELETE 语句时,MySQL 会获取写入锁,以保证在删除数据时的数据一致性。这会阻止其他会话同时删除相同的数据,但其他会话可以读取已存在的数据。

值得注意的是,MySQL 也支持更细粒度的锁定机制,例如行级锁(Row-level Locking)和表级锁(Table-level Locking)。这些锁可以在特定场景下使用,以提高并发性能和数据一致性。

此外,MySQL 还提供了事务(Transaction)的支持,通过事务的隔离级别(Isolation Level)设置,可以控制在事务中的读取和写入操作所触发的锁类型和范围。

加行锁一定要涉及索引吗?

在 MySQL 中,加行级锁(Row-level Locking)通常需要通过索引来实现。如果没有适当的索引,MySQL 将使用表级锁(Table-level Locking)来锁定整个表,而不是特定的行。