DELETE-UPDATE-INSERT-语句会自动加锁
目录
DELETE/ UPDATE/ INSERT 语句会自动加锁
在数据库系统中,
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锁)、插入意向锁 | 阻止其他事务修改新插入的行,但通常不会阻塞其他插入操作(除非有间隙锁)。 |