目录

DELETE-UPDATE-INSERT-语句会自动加锁

DELETE/ UPDATE/ INSERT 语句会自动加锁

在数据库系统中, DELETEUPDATEINSERT 语句通常会自动加锁,以确保数据的一致性和并发控制。具体的锁类型和效果取决于数据库的实现(如 MySQL、PostgreSQL 等)以及事务的隔离级别。以下是这些操作通常加锁的行为和效果:


1. DELETE 语句

  • 加锁类型

    • 行级锁DELETE 会对要删除的行加锁,通常是 排他锁(X锁)
    • 间隙锁(Gap Lock) :在某些隔离级别(如 MySQL 的 REPEATABLE READ ), DELETE 还可能对索引间隙加锁,防止其他事务插入新数据。
  • 效果

    • 其他事务无法对被删除的行加锁或修改,直到当前事务提交或回滚。
    • 如果使用了间隙锁,其他事务也无法在锁定范围内插入新数据。

2. UPDATE 语句

  • 加锁类型

    • 行级锁UPDATE 会对要修改的行加锁,通常是 排他锁(X锁)
    • 间隙锁(Gap Lock) :在某些隔离级别下, UPDATE 也可能对索引间隙加锁,防止其他事务插入新数据。
  • 效果

    • 其他事务无法对被修改的行加锁或修改,直到当前事务提交或回滚。
    • 如果使用了间隙锁,其他事务也无法在锁定范围内插入新数据。

3. INSERT 语句

  • 加锁类型

    • 行级锁INSERT 会对新插入的行加锁,通常是 排他锁(X锁)
    • 插入意向锁(Insert Intention Lock) :在插入数据时,数据库会对插入的位置加插入意向锁,表示有事务准备在此处插入数据。
  • 效果

    • 其他事务无法对新插入的行加锁或修改,直到当前事务提交或回滚。
    • 插入意向锁不会阻塞其他事务的插入操作,除非插入的位置被间隙锁锁定。

4. 锁的效果与隔离级别

  • READ UNCOMMITTED

    • 不加锁(或只加极少的锁),允许读取未提交的数据。
  • READ COMMITTED

    • 对修改的行加排他锁,但不会加间隙锁。
  • REPEATABLE READ

    • 对修改的行加排他锁,并可能加间隙锁,防止幻读。
  • SERIALIZABLE

    • 对涉及的范围加锁,包括行锁和间隙锁,确保完全串行化执行。

5. 总结

操作锁类型效果
DELETE行级锁(X锁)、间隙锁阻止其他事务修改或删除该行,可能阻止插入新数据。
UPDATE行级锁(X锁)、间隙锁阻止其他事务修改该行,可能阻止插入新数据。
INSERT行级锁(X锁)、插入意向锁阻止其他事务修改新插入的行,但通常不会阻塞其他插入操作(除非有间隙锁)。