gpt4 book ai didi

SQL For Update 跳过锁定查询和 Java 多线程 - 如何解决此问题

转载 作者:行者123 更新时间:2023-12-02 08:53:29 24 4
gpt4 key购买 nike

SELECT 
id
FROM table_name tkn1,
(SELECT
id,
ROWNUM rnum
FROM table_name
WHERE
PROCS_DT is null
order by PRTY desc, CRET_DT) result
WHERE tkn1.id= result.id
AND result.rnum <= 10 FOR UPDATE OF tkn1.id SKIP LOCKED

这是我的问题。 2 个线程同时访问此查询

线程 1 - 执行 select 并锁定按优先级降序和创建日期排序的 10 行。接下来,我将通过单独的查询将 procs_dt 更新为今天的日期。

线程 2 - 在线程 1 更新 procs_dt 或提交之前,该线程执行此查询。我的要求是接下来的 10 个解锁行必须移交给线程 2。但真正发生的是同一组锁定行从内​​部查询中出来,因为 procs_dt 仍然为 null 并且尚未由线程 1 更新,并且因为跳过外部查询中给出了锁定,所有这 10 行都将被跳过,并且不会返回任何记录供线程 2 处理

这最终违背了我的多线程要求。

如何解决这个问题?我尝试将跳过锁定添加到内部查询。但oracle 11g不允许。

请专家帮忙。我使用的是oracle 11g

最佳答案

我会选择这样的东西:用于选择更新行的游标,并使用 LIMIT 子句获取前十个可用行。

create table gm_temp
as select rownum id, table_name obj_name, date '2011-01-01' + rownum create_date
from all_tables where rownum < 500;

CREATE TYPE tab_number IS TABLE OF NUMBER;

DECLARE
cursor c_table IS
SELECT id FROM gm_temp ORDER BY create_date DESC FOR UPDATE OF id SKIP LOCKED;
t_table_src tab_number := tab_number();
BEGIN
OPEN c_table;
FETCH c_table BULK COLLECT INTO t_table_src LIMIT 10;
CLOSE c_table;
dbms_output.put_line(':'||t_table_src.count||':'||t_table_src(1));
END;

实际上,我首先会看看将所有未完成的行作为一个集合处理是否会比多线程更好。

然后,如果我确实决定需要某种形式的多线程,我会考虑启用并行的管道函数(假设我使用的是企业版)。

关于SQL For Update 跳过锁定查询和 Java 多线程 - 如何解决此问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com