【问题标题】:Select top N with "for update skip locked" in Oracle在 Oracle 中选择“for update skip locked”的前 N ​​个
【发布时间】:2011-04-25 18:14:36
【问题描述】:

在 Oracle 中,我可以选择排序表中的前 1 条消息

select messageid from(
    select 
        messageid, 
        RANK() over (order by messageid asc) as msg_rank 
    from messages
) where msg_rank=1;

正如我在previous question 中发现的那样,我可以用

专门选择一行
select * from messages where rownum < 2 for update skip locked;

但是我不能将这两个概念合并在一起

select messageid from(
    select 
        messageid, 
        RANK() over (order by messageid asc) as msg_rank 
    from messages
) where msg_rank=1 for update skip locked;

-- results in error
-- ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.

如何使用 readpast 锁定选择前 N 个?

【问题讨论】:

标签: sql oracle locking top-n


【解决方案1】:

这行得通吗?

select messageid from messages 
    where messageid in (
       select messageid from(
         select 
          messageid, 
          RANK() over (order by messageid asc) as msg_rank 
          from messages
       ) where msg_rank=1
    )
  for update skip locked;

【讨论】:

  • 如果分两步完成,我不是引入了潜在的竞争条件吗?我遵循你的逻辑,但我很难相信 Oracle 不能做 SQL Server 能做的事情。
  • 那个查询执行得很好。我将继续测试锁定是否按预期工作,但这似乎很好。谢谢!
  • 好吧,在这种情况下,跳过锁定的语义可能有点棘手,即使在 SQL Server 上也是如此。我希望上面的查询首先找到前 N 条消息,然后在它们之间跳过(这样你最终可能会得到少于 N 条记录)。而且我认为一般来说没有办法解决这个问题(没有锁定整个表格)。
  • 所以你实际上在这里选择了前 n
猜你喜欢
  • 2021-12-05
  • 2019-10-19
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2019-04-16
  • 2016-01-29
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多