【发布时间】:2015-06-23 04:15:34
【问题描述】:
假设我有 Oracle 表 books 存储 n 个书籍信息,其中包含 id 和 title 列。一些元组被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 行,除非指定了等待子句。