在數據庫系統中,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鎖)、插入意向鎖 | 阻止其他事務修改新插入的行,但通常不會阻塞其他插入操作(除非有間隙鎖)。 |