Oracle 以此兩類基礎鎖實作並發控制。
本文聚焦 DML 鎖。
| 模式 | 代碼 | 描述 | 觸發 SQL |
|---|---|---|---|
| NULL | 1 | 空 | SELECT |
| SS (Row-S) | 2 | 列級共享 | SELECT FOR UPDATE, LOCK TABLE ... ROW SHARE |
| SX (Row-X) | 3 | 列級排他 | INSERT/UPDATE/DELETE, LOCK TABLE ... ROW EXCLUSIVE |
| S (Share) | 4 | 共享 | CREATE INDEX, LOCK TABLE ... SHARE |
| SSX (S/Row-X) | 5 | 共享列級排他 | LOCK TABLE ... SHARE ROW EXCLUSIVE |
| X (Exclusive) | 6 | 排他 | ALTER/DROP/TRUNCATE TABLE, LOCK TABLE ... EXCLUSIVE |
執行 DML 時自動取得 TX 鎖,持有至 COMMIT/ROLLBACK。同一列並發 DML 時,首個會話加鎖,其餘等待。首個提交釋放 TX 鎖,其他才能繼續。
| 視圖 | 用途 | 關鍵欄位 |
|---|---|---|
| V$SESSION | 會話與鎖資訊 | SID, SERIAL#, PROGRAM, ROW_WAIT_OBJ# |
| V$SESSION_WAIT | 等待事件詳情 | SID, SECONDS_IN_WAIT, EVENT |
| V$LOCK | 系統所有鎖 | SID, TYPE(TM/TX), ID1, LMODE, REQUEST |
| DBA_LOCKS | V$LOCK 格式化 | SESSION_ID, LOCK_TYPE, MODE_HELD, MODE_REQUESTED |
| V$LOCKED_OBJECT | 僅 DML 鎖,含回滾段 | XIDUSN, XIDSLOT, XIDSQN, OBJECT_ID, LOCKED_MODE |
V$LOCK 找出 TYPE='TX' 且 REQUEST>0 的會話(等待者)Oracle 自動偵測死鎖,犧牲一交易回滾並回報 ORA-00060,記錄於 alert_SID.log 與 USER_DUMP_DEST 追蹤檔。追蹤檔含詳細死鎖圖(等待鏈、SQL、物件)。
常見死鎖類型:列級鎖、位圖索引死鎖。若追蹤檔指向位圖索引,改為 B-tree 索引通常可解決。