0

当两个用户同时启动一个进程时,我在 oracle 10g 数据库中的查询出现问题。此查询正在插入另一个表中的卷数据。

我试图简化示例:

表结构:

表 1 VAL1 | VAL2

表2 ID | VAL1 | VAL2

询问:

插入Table2 (id, VAL1,VAL2)
select t2.id + rownum , t1.VAL1, t1.VAL2 from Table1 t1, (select max(id) as id from table2) t2

问题描述:

User1 启动进程,查询将插入 50000 条 id 从 1 到 50000 的记录

User2 同时启动进程,select max(id) as id from table2 不会返回预期值 50000,因为 user1 插入的行尚未提交,因此系统将尝试插入具有相同 Id 的行。

似乎 oracle 不允许像 sql server 或 DB2 这样的脏读,有没有办法允许从未提交的行读取?或另一种选择?

4

2 回答 2

3

另一种选择(在 Oracle 世界中更好)是使用序列来生成您的 ID:

Insert into Table2 (id, VAL1,VAL2)
myseq.nextval, t1.VAL1, t1.VAL2 from Table1 t1;

这将保证在多用户、多进程环境中,每次迭代都有一个唯一的递增值。

于 2020-05-21T12:14:40.650 回答
0

没有 Oracle 数据库没有这样的特性(无论是什么版本或版本)。如果确实需要,您将需要使用另一个数据库产品。

于 2020-05-21T10:27:47.500 回答