在 Oracle 数据库中,锁表是控制并发访问的重要机制。以下是几种常用的锁表方法:
-- 使用 SELECT FOR UPDATE 锁定查询的行
SELECT * FROM employees WHERE department_id = 10 FOR UPDATE;
-- 使用 NOWAIT 选项(如果行已被锁定,立即返回错误)
SELECT * FROM employees WHERE employee_id = 100 FOR UPDATE NOWAIT;
-- 使用 WAIT n 选项(等待n秒后超时)
SELECT * FROM employees WHERE employee_id = 100 FOR UPDATE WAIT 5;
-- 排他锁 (X锁) - 阻止其他会话进行任何操作
LOCK TABLE employees IN EXCLUSIVE MODE;
-- 共享锁 (S锁) - 允许其他会话读取但不能修改
LOCK TABLE employees IN SHARE MODE;
-- 行共享锁 (RS锁)
LOCK TABLE employees IN ROW SHARE MODE;
-- 行排他锁 (RX锁)
LOCK TABLE employees IN ROW EXCLUSIVE MODE;
-- 共享行排他锁 (SRX锁)
LOCK TABLE employees IN SHARE ROW EXCLUSIVE MODE;
执行某些 DDL 语句会自动锁定表:
ALTER TABLE employees ADD (new_column VARCHAR2(20));
TRUNCATE TABLE employees;
-- 查看当前会话持有的锁
SELECT * FROM v$lock WHERE sid = (SELECT sid FROM v$mystat WHERE rownum = 1);
-- 查看所有锁
SELECT l.session_id, o.owner, o.object_name, o.object_type, l.locked_mode
FROM v$locked_object l, dba_objects o
WHERE l.object_id = o.object_id;
-- 提交或回滚事务会自动释放锁
COMMIT;
-- 或
ROLLBACK;
-- 终止持有锁的会话(需要DBA权限)
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
需要更具体的锁表场景或遇到特定问题时,可以提供更多细节以便给出更有针对性的建议。