orcale的锁模式
Oracle 锁模式概述
Oracle数据库通过多种锁模式管理并发访问,确保数据一致性和事务隔离性。锁模式主要分为行级锁和表级锁,每种模式适用于不同场景。
行级锁(Row-Level Locks)
行级锁针对单行数据,允许多事务并发修改不同行,最小化锁冲突。
共享锁(Shared Lock, S锁)
- 事务读取数据时自动获取,其他事务可同时获取共享锁,但无法获取排他锁。
- 语法示例(通过
SELECT ... FOR UPDATE显式加锁):SELECT * FROM employees WHERE employee_id = 100 FOR UPDATE;
排他锁(Exclusive Lock, X锁)
- 事务修改数据时自动获取,其他事务无法获取任何锁(包括共享锁)。
- 通过DML语句(如
UPDATE、DELETE)隐式加锁:UPDATE employees SET salary = 5000 WHERE employee_id = 100;
表级锁(Table-Level Locks)
表级锁锁定整个表,通常用于DDL操作或维护任务。
行共享锁(Row Share, RS)
- 允许其他事务并发读取表,但阻止排他锁。
- 语法示例:
LOCK TABLE employees IN ROW SHARE MODE;
行排他锁(Row Exclusive, RX)
- 允许其他事务读取表,但阻止共享锁和排他锁。
- 通过DML语句自动获取:
UPDATE employees SET department_id = 10 WHERE employee_id = 200;
共享锁(Share, S)
- 阻止其他事务修改表,但允许读取。
- 语法示例:
LOCK TABLE employees IN SHARE MODE;
共享行排他锁(Share Row Exclusive, SRX)
- 阻止其他事务获取共享锁或修改数据,允许读取。
- 语法示例:
LOCK TABLE employees IN SHARE ROW EXCLUSIVE MODE;
排他锁(Exclusive, X)
- 完全锁定表,其他事务无法读取或修改。
- 语法示例:
LOCK TABLE employees IN EXCLUSIVE MODE;
锁的兼容性
不同锁模式之间存在兼容性规则:
| 当前锁模式 | 请求的锁模式:S | X | RS | RX | SRX |
|---|---|---|---|---|---|
| S | 是 | 否 | 是 | 否 | 否 |
| X | 否 | 否 | 否 | 否 | 否 |
| RS | 是 | 否 | 是 | 是 | 否 |
| RX | 否 | 否 | 是 | 是 | 否 |
| SRX | 否 | 否 | 否 | 否 | 否 |
查看锁信息
通过数据字典视图监控锁状态:
SELECT session_id, oracle_username, locked_mode, object_name FROM v$locked_object lo JOIN dba_objects do ON lo.object_id = do.object_id;死锁处理
Oracle自动检测死锁并终止其中一个事务。可通过以下方式避免:
- 事务按相同顺序访问资源。
- 减少事务持有锁的时间。
- 使用
NOWAIT选项避免等待:SELECT * FROM employees WHERE employee_id = 100 FOR UPDATE NOWAIT;
注意事项
- 行级锁是Oracle的默认锁机制,优先使用以减少冲突。
- 表级锁可能影响并发性能,谨慎使用。
- 长时间持有锁可能导致阻塞,需优化事务设计。
通过合理选择锁模式,可以平衡并发性能与数据一致性需求。
