orcale的锁模式

📅 2026/7/3 2:31:30 👁️ 阅读次数 📝 编程学习
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语句(如UPDATEDELETE)隐式加锁:
    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;

锁的兼容性

不同锁模式之间存在兼容性规则:

当前锁模式请求的锁模式:SXRSRXSRX
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的默认锁机制,优先使用以减少冲突。
  • 表级锁可能影响并发性能,谨慎使用。
  • 长时间持有锁可能导致阻塞,需优化事务设计。

通过合理选择锁模式,可以平衡并发性能与数据一致性需求。