【发布时间】:2011-07-01 13:30:36
【问题描述】:
我正在编写一个 Windows 应用程序(在 Qt 4.6 中),它 - 在某些时候 - 将 1 到 76000 之间的任意数量的数据集插入到某个 oracle (10.2) 表中。应用程序必须从序列中检索主键,或者至少是主键范围。然后它将 ID 存储在一个列表中,用于批量执行准备好的查询。
(注意:不能使用触发器,其他任务也使用该序列)
为了避免调用序列X次,我想将序列增加X。
到目前为止,我发现以下代码可以在一个过程中使用:
ALTER SEQUENCE my_sequence INCREMENT BY X;
SELECT my_sequence.CURVAL + 1, my_sequence.NEXTVAL
INTO v_first_number, v_last_number
FROM dual;
ALTER SEQUENCE my_sequence INCREMENT BY 1;
不过,我有两个主要顾虑:
- 我读到 ALTER SEQUENCE 会产生一个隐式提交。这是否意味着将提交由 Windows 应用程序启动的事务?如果是这样,你能以某种方式避免它吗?
-
这个概念是多用户证明吗?或者会发生以下情况:
Sequence is at 10,000 Session A sets increment to 2,000 Session A selects 10,001 as first and 12,000 as last Session B sets increment to 5,000 Session A sets increment to 1 Session B selects 12,001 as first and 12,001 as last Session B sets increment to 1即使该过程会相当快,但在我的应用程序中,两个不同的用户导致该过程几乎同时被调用的可能性不大
【问题讨论】:
-
为什么不让数据库只管理递增1的序列呢?在插入语句中使用 Seq.NEXTVAL。这不是性能问题。
-
我正在使用一个准备好的查询,它接收列表而不是单个值作为绑定值,并通过 Qt 的“execBatch()”命令执行。我不知道在批处理执行的准备好的查询中使用 seq.NEXTVAL 是否有效,周一必须尝试一下。然而,考虑到性能,批量执行是必须的。