Oracle11g 如何使用;选择“更新”选项;下面给出的11g场景中的锁?

Oracle11g 如何使用;选择“更新”选项;下面给出的11g场景中的锁?,oracle11g,Oracle11g,我有多种工作类型 CREATE TABLE EMP (EMPNO NUMBER(10) PRIMARY KEY, JOB_TYPE VARCHAR2(20), PROCESSED VARCHAR2(3), THREAD NUMBER(4)); INSERT INTO EMP VALUES (7125, 'MANAGER', 'NO', NULL); INSERT INTO EMP VALUES (7250, 'MANAGER', 'NO', NULL); INSERT INTO EMP VA

我有多种工作类型

CREATE TABLE EMP (EMPNO NUMBER(10) PRIMARY KEY, JOB_TYPE VARCHAR2(20), PROCESSED VARCHAR2(3), 
THREAD NUMBER(4));

INSERT INTO EMP VALUES (7125, 'MANAGER', 'NO', NULL);
INSERT INTO EMP VALUES (7250, 'MANAGER', 'NO', NULL);
INSERT INTO EMP VALUES (7400, 'MANAGER', 'NO', NULL);
INSERT INTO EMP VALUES (7445, 'CLERK', 'NO', NULL);
INSERT INTO EMP VALUES (7550, 'CLERK', 'NO', NULL);
INSERT INTO EMP VALUES (7600, 'CLERK', 'NO', NULL);
INSERT INTO EMP VALUES (7945, 'CLERK', 'NO', NULL);
INSERT INTO EMP VALUES (7965, 'ANALYST', 'NO', NULL);
INSERT INTO EMP VALUES (7970, 'ANALYST', 'NO', NULL);
INSERT INTO EMP VALUES (7975, 'ANALYST', 'NO', NULL);
INSERT INTO EMP VALUES (7980, 'ANALYST', 'NO', NULL);
INSERT INTO EMP VALUES (7985, 'ANALYST', 'NO', NULL);
INSERT INTO EMP VALUES (7990, 'ANALYST', 'NO', NULL);

COMMIT;
现在,我想生成多个并行线程,它们将处理每种作业类型,而不必彼此等待。处理完该行后,线程将其标记为已处理(将已处理更新为是,将线程更新为线程编号),并移动到下一行

最后,这个表应该是这样的

EMPNO   JOB_TYPE    PROCESSED   THREAD
7125    MANAGER     YES         1
7250    MANAGER     YES         1
7400    MANAGER     YES         1
7445    CLERK       YES         2
7550    CLERK       YES         2
7600    CLERK       YES         2
7945    CLERK       YES         2
7965    ANALYST     YES         3
7970    ANALYST     YES         3
7975    ANALYST     YES         3
7980    ANALYST     YES         3
7985    ANALYST     YES         3
7990    ANALYST     YES         3
线程1处理了经理行,线程2处理了职员行,线程3处理了分析师行

我的思路是:

线程1进入,批量获取所有管理器行,锁定它们并处理它们。 线程2进入,尝试批量获取所有管理器行,发现它被锁定,因此跳到下一个作业类型。批量获取、锁定和处理职员行。 线程3进入,看到经理和职员被锁定,所以转到分析师行

还请注意,每个线程都将处理标记为“否”的行。因此,在一个线程完成其处理并释放锁后,另一个线程不应重新处理相同的行,因为它们现在标记为“已处理=是”

在类似于生产的环境中,我将有数百种作业类型,每种作业类型有数千行。DBA将在外部控制并行线程的数量,具体取决于在任何给定时间数据库中使用的资源量

关于UPDATE SKIP LOCKED,我发现的一个警告是,锁是在实际获取行时获得的(如果您在pl/sql中使用游标),而不是在打开游标时获得的

这里的一个重要标准是,我不希望两个线程处理一种作业类型

这些都有意义吗


关于不使用AQ,我的意见是,我需要额外的特权才能在数据库中设置AQ,而SKIP LOCKED似乎正好能够实现这一点。您是说SKIP LOCKED不能用来代替11g中的AQ吗

您是否关心由谁生成要处理数据的线程?您真的需要锁定行吗,还是您认为这是必要的


Oracle提供的允许您轻松地将工作分解为块,并使用调度程序将这些工作块分配给不同的线程。在您的情况下,您可以使用
CREATE\u CHUNKS\u BY\u SQL
为每个
JOB\u类型创建一个块

请在将来格式化您的代码。@Tony:您能告诉我您希望使用哪种格式吗?就像我刚才为您做的格式化一样,但您已经撤消了!如果您选择代码块并按下标记为{}的按钮,它将全部缩进4个空格,从而使其格式整齐。感谢Tony的建议。我会注意到这一点。请特别注意“因此,最后,表应该是这样的”之后的部分@kedar-我只是想澄清一下,那么你在乎是谁产生了线程?你不想让数据库产生线程?问题是当thread1使用“for update”锁定一些行时。同时thread2尝试读取相同的行。但当thread1完成计算时,它会将其标记为“已处理”=“是”,thread2也在做同样的事情。因此,为了避免上述情况,我遇到了“跳过锁定”和“NOWAIT”这两个选项中的哪一个适用于上述场景?