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-执行选择并锁定按优先级降序和创建日期排序的10行。接下来,我将通过单独的查询将procs_dt更新为今天的日期。
线程2-在从线程1更新procs_dt或commit之前,此线程执行此查询。我的要求是必须将下10个未锁定的行移交给线程2。但是实际上发生的是同一组锁定行从内部查询中出来,因为procs_dt仍然为null,并且尚未由线程1进行更新,并且由于跳过在外部查询中给出了locked,所有这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;
实际上,我首先要看看将所有未完成的行作为一个集合进行处理是否比多线程处理要好。
然后,如果确实确定我需要某种形式的多线程,那么我将研究启用了并行功能的流水线函数(假设我使用的是Enterprise Edition)。
Java 语言通过 synchronized 关键字来保证原子性,这是因为每一个 Object 都有一个隐含的锁,这个也称作监视器对象。在进入 synchronized 之前自动获取此内部锁,而一旦离开此方式,无论是完成或者中断都会自动释放锁。显然这是一个独占锁,每个锁请求之间是互斥的。相对于众多高级锁 (Lock/ReadWriteLock 等),synchronized 的代价都比后者要高。但
本文向大家介绍MySQL redo死锁问题排查及解决过程分析,包括了MySQL redo死锁问题排查及解决过程分析的使用技巧和注意事项,需要的朋友参考一下 问题背景 周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪,还好现场环境还在,为排查问题提
本文向大家介绍Java如何通过线程解决生产者/消费者问题,包括了Java如何通过线程解决生产者/消费者问题的使用技巧和注意事项,需要的朋友参考一下 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示 生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生
我试图理解java中的公平锁,并从中执行了一个实现 http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html 哪个很好 代码如下所示 队列对象的代码 我了解其中的大部分,但我有两个疑问 1)在这一行代码中 这个零件是做什么用的? 它有什么作用?因为我删除了这部分代码,得到了相同的正确结果。 2) 因为我相信我
我的问题是。。。为什么选择completionLock。run方法中的lock()未锁定资源。当我在系统中运行程序时。出来println(Thread.currentThread())。getName()) 我得到以下输出:Thread-1 Thread-0 Thread-0 Thread-1 NoLock ATM:130 Locked ATM:160应该是:160程序终止。 还有什么是等到完成才
实现一个以整数为参数的静态方法,使用Math类计算给定整数的整数平方根。如果整数为负数,则取其正数的平方根,然后返回结果的负数,表示它是一个虚数 我一直在尝试,一直到这里