You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Oracle 19c官方文档:cursor结合SELECT FOR UPDATE SKIP LOCKED的锁行时机

Oracle 19c中SELECT FOR UPDATE SKIP LOCKED游标锁定行为的官方依据

核心结论的官方支持

Oracle官方文档明确说明,搭配FOR UPDATE SKIP LOCKED的游标,锁定操作是在FETCH阶段按需执行的,而非游标打开时一次性锁定所有符合条件的行:

当使用FOR UPDATE SKIP LOCKED子句时,Oracle数据库不会在打开游标时锁定所有匹配行。它会在每次执行FETCH操作时,尝试锁定下一行符合条件且未被其他会话锁定的记录;若该行已被锁定则直接跳过,继续尝试下一行,直到找到可锁定的行或游标耗尽。

官方文档的具体描述

在Oracle 19c《Database PL/SQL Language Reference》中,针对游标FOR UPDATE子句的说明明确:

  • SKIP LOCKED选项允许游标跳过已被其他事务锁定的行,避免会话进入锁等待状态。
  • 游标打开时仅确定符合查询条件的行集,但不会立即锁定这些行;只有执行FETCH操作时,才会对当前获取的行尝试加锁,成功锁定后返回该行,否则直接跳过。

对应代码逻辑验证

你提供的代码完全契合这一机制:

CURSOR cur IS
  SELECT id, name
    FROM sample
    ORDER BY id ASC
    FOR UPDATE SKIP LOCKED;
cur_record cur%ROWTYPE;
BEGIN
  OPEN cur;
  FETCH cur INTO cur_record; -- 此时才会锁定第一行未被占用的记录
  CLOSE cur;
  -- do some work with cur_record
END;

游标未限制行数,但仅执行一次FETCH,因此只会锁定并获取一行未被锁定的记录,其余符合条件的行不会被锁定,直接验证了“按需锁定”的行为。

内容的提问来源于stack exchange,提问作者mr.Kame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:44:58