MySQL共享锁、排他锁、记录锁、间隙锁和表锁介绍及SQL示例

MySQL锁类型

在MySQL中,有多种类型的锁用于管理并发访问和保证数据的一致性。下面是一些常见的MySQL锁类型及其说明:

  1. 共享锁(Shared Lock):

    • 共享锁允许多个事务同时读取一个资源,但不允许并发事务对该资源进行写操作。
    • 多个事务可以同时持有共享锁,并且共享锁之间不会互斥。
    • 示例:多个事务同时读取同一张表的数据。
  2. 排他锁(Exclusive Lock):

    • 排他锁只允许一个事务独占地持有锁,并且其他事务无法同时持有该锁。
    • 排他锁用于对资源进行写操作,其他事务无法同时读取或写入该资源。
    • 示例:一个事务对某一行数据进行更新操作,其他事务无法同时对该行数据进行读取或写入。
  3. 记录锁(Record Lock):

    • 记录锁是针对表中的某一行数据的锁,用于控制对该行数据的并发访问。
    • 记录锁可以是共享锁或排他锁,具体取决于事务对数据的读写操作。
    • 示例:事务A对表中的某一行数据获取了共享锁,事务B无法获取排他锁,直到事务A释放锁。
  4. 间隙锁(Gap Lock):

    • 间隙锁是用于锁定索引范围之间的间隙,以避免其他事务在范围内插入数据。
    • 间隙锁是为了防止幻读现象的发生,确保范围查询的一致性。
    • 示例:事务A锁定了表中的某个索引范围,防止其他事务在该范围内插入新数据。
  5. 表锁(Table Lock):

    • 表锁是对整个表进行加锁,将表级别的资源进行互斥,使其他事务无法同时访问整个表。
    • 表锁的粒度最大,对并发性能影响较大,一般情况下尽量避免使用。
    • 示例:事务A对整个表进行写操作,其他事务无法同时读取或写入该表。

这些锁类型在MySQL中有不同的使用场景和行为。根据具体的业务需求和并发控制要求,可以选择适当的锁类型来保证数据的一致性和并发性。在实际开发中,需要根据具体情况合理选择锁策略,以避免死锁、性能瓶颈和并发冲突等问题的发生。

SQL示例

以下是针对上述提到的五种锁的示例 SQL:

  1. 共享锁(Shared Lock):

    -- 事务A获取共享锁
    START TRANSACTION;
    SELECT * FROM table_name WHERE condition FOR SHARE;
    -- 事务B尝试获取共享锁(可以同时获取)
    START TRANSACTION;
    SELECT * FROM table_name WHERE condition FOR SHARE;
    
  2. 排他锁(Exclusive Lock):

    -- 事务A获取排他锁
    START TRANSACTION;
    SELECT * FROM table_name WHERE condition FOR UPDATE;
    -- 事务B尝试获取排他锁(等待事务A释放锁)
    START TRANSACTION;
    SELECT * FROM table_name WHERE condition FOR UPDATE;
    
  3. 记录锁(Record Lock):

    -- 事务A获取记录锁(共享锁)
    START TRANSACTION;
    SELECT * FROM table_name WHERE condition FOR SHARE;
    -- 事务B尝试获取记录锁(排他锁)
    START TRANSACTION;
    SELECT * FROM table_name WHERE condition FOR UPDATE;
    
  4. 间隙锁(Gap Lock):

    -- 事务A获取间隙锁
    START TRANSACTION;
    SELECT * FROM table_name WHERE indexed_column BETWEEN value1 AND value2 FOR UPDATE;
    -- 事务B尝试在间隙内插入新数据(被阻塞)
    START TRANSACTION;
    INSERT INTO table_name (column1, column2) VALUES (value1, value2);
    
  5. 表锁(Table Lock):

    -- 事务A获取表级锁
    LOCK TABLES table_name WRITE;
    -- 事务B尝试读取或写入整个表(被阻塞)
    START TRANSACTION;
    SELECT * FROM table_name;
    

以上示例展示了各种锁的基本使用方式,注意其中的锁语句和锁类型的选择。具体的锁使用需要根据实际需求和并发控制的要求进行调整。

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/131039960