在数据库系统中,DELETE
、UPDATE
和 INSERT
语句通常会自动加锁,以确保数据的一致性和并发控制。具体的锁类型和效果取决于数据库的实现(如 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锁)、插入意向锁 | 阻止其他事务修改新插入的行,但通常不会阻塞其他插入操作(除非有间隙锁)。 |