【问题标题】:Alternative for uncommitted reads in oracle databaseoracle数据库中未提交读取的替代方案
【发布时间】:2020-05-21 10:16:51
【问题描述】:

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

我试图简化示例:

表格结构:

表 1 VAL1 | VAL2

表 2 ID | VAL1 | VAL2

查询:

插入Table2(id、VAL1、VAL2)
选择 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 插入的行尚未提交,因此系统将尝试插入带有相同的身份。

似乎 oracle 不允许像 sql server 或 DB2 这样的脏读,有没有办法允许从未提交的行读取?或其他替代方案?

【问题讨论】:

    标签: sql database oracle nolock


    【解决方案1】:

    替代方法(在 Oracle 世界中更好)是使用序列来生成您的 ID:

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

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

    【讨论】:

    • 我同意使用序列并让数据库管理身份列是首选和推荐的方法。 DB2 现在也支持它们。
    【解决方案2】:

    任何 Oracle 数据库都没有这样的功能(无论是哪个版本或版本)。如果确实需要,则需要使用其他数据库产品。

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多