1

我们有一个聚合一些数据并将结果插入到另一个表中的过程,该表用于高效查询。我们面临的问题是我们现在有多个聚合器几乎同时运行。

我们使用原始记录 id 作为这个新表中的主键 - 一个唯一约束。但是,如果两个聚合进程同时运行,其中一个会因违反唯一约束而出错。

有没有办法指定某种锁定机制,让第二个作家等到第一个作家完成?或者,有没有办法告诉 oracle 忽略该特定行并继续其余的?

不幸的是,将聚合减少到单个过程是不切实际的,因为以下过程依赖于可用数据的最新版本,并且这些过程确实需要扩展。

编辑:

以下是我的 [已编辑] 查询:

INSERT INTO
agg_table
SELECT
h.id, h.col, h.col2
FROM history h
JOIN call c
ON  c.callid = h.callid
WHERE
h.id > (SELECT coalesce(max(id),0) FROM agg_table)
4

3 回答 3

3

可以运行带有错误日志记录子句的INSERT语句。Oracle 文档中的示例如下:

INSERT INTO dw_empl
  SELECT employee_id, first_name, last_name, hire_date, salary, department_id 
  FROM employees
  WHERE hire_date > sysdate - 7
  LOG ERRORS INTO err_empl ('daily_load') REJECT LIMIT 25

或者,您可以尝试使用[MERGE][2]语句。您将通过从明细表中进行选择合并到汇总表中。如果未找到匹配项,则您INSERT和如果找到匹配项,您将UPDATE. 我相信这个解决方案将处理您的并发问题,但您需要对其进行测试。

于 2013-02-18T05:20:41.450 回答
0

看看FOR UPDATE子句。如果您在更新/插入语句之前在事务中正确编写带有 FOR UPDATE 子句的 SELECT 语句,您将能够“锁定”所需的记录

于 2013-02-18T05:21:27.427 回答
0

序列化插入可能是最好的方法,因为没有任何方法可以解决多个插入无法看到每个插入在做什么的问题。

DBMS_Lock 可能是适当的序列化机制。

于 2013-02-18T10:58:10.277 回答