【问题标题】:How can I retrieve next n unlocked rows from Oracle?如何从 Oracle 检索下一个未锁定的行?
【发布时间】:2015-06-23 04:15:34
【问题描述】:

假设我有 Oracle 表 books 存储 n 个书籍信息,其中包含 idtitle 列。一些元组被SELECT ... FOR UPDATE 子句锁定。

假设 id 在 (1, 2, 4, 5, 6, 9) 中的这些行被锁定。

现在我想写一个 SQL 来实现,当执行它时,返回 next 2 条被解锁的记录。并且SQL可能被多个进程同时调用。

也就是说第一次调用会返回id=3和id=7的记录;第二次调用将返回 id = 8 和 id = 10 条记录。

我认为SELECT ... FOR UPDATE SKIP LOCKED 会有所帮助,它会自动跳过被锁定的行并解决多个进程同时调用的问题。但是如何实现获得next 2条记录呢?我认为rownum 不起作用,因为我不知道哪些行被锁定。

有人可以分享你的想法吗?非常感谢!

【问题讨论】:

  • 您是否证明使用 rownum 谓词行不通?
  • @DavidAldridge 是的,确实如此。因为不知道锁定了哪些行,所以不能用rownum来限制。
  • 这听起来像是一个推论,而不是一个实际的测试。我没有看到任何说明 rownum 和 skip locked 不起作用的文档。
  • "skip locked" 在 rownum 过滤器之后应用,因此如果您提供了一个已锁定的 rownum,则查询将返回 0 行,除非指定了等待子句。

标签: sql oracle


【解决方案1】:

在 12c 中,您可以使用 row_limiting_clause,记录在这里:http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702

一般语法是:

[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
    { ROW | ROWS } { ONLY | WITH TIES } ]

或者,使用此处记录的 Oracle Streams 高级队列 API:http://docs.oracle.com/database/121/ADQUE/aq_opers.htm#ADQUE2835

【讨论】:

    【解决方案2】:

    我不是 oracle 专家(甚至不是用户;))但这可能有用吗? (如this answer 建议的那样):

    SELECT * FROM  MYTABLE FOR UPDATE SKIP LOCKED        
    OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2012-06-23
      • 2011-04-21
      相关资源
      最近更新 更多