我有一个用 Java 编写的程序,它创建了 5 个从 Oracle 中选择数据的线程。选择是这样的:
select * from queue_requests where request_status = 0 and date_requested <= sysdate and rownum <= ? for update skip locked
我将参数设置为1024。我经常得到以下结果(使用System.out.println):
线程 0 更新 1024
线程 4 更新 0
线程 1 更新 0
线程 2 更新 0
线程 3 更新 0
因此,只有一个线程找到要更新的行。从我在不同文章中发现的内容来看,我认为 oracle 首先应用rownum子句,然后再应用update skip locked,因此所有线程都尝试更新前 1024 行。我可能会使用类似的东西:
select * from (select * from queue_requests where request_status = 0 and date_requested <= sysdate for update skip locked) where rownum <= ?
但这将锁定所有行,然后返回其中的一部分。我不想锁定所有行。
我找到了一个创建存储过程的解决方案,但我无法更改数据库中的任何内容。我还发现了一些关于高级队列的东西,但我不确定我需要这么复杂的东西(我也没有找到任何好的例子)。
这个问题有什么解决办法吗?