【问题标题】:Getting correct auto incremented ID in Oracle DB在 Oracle DB 中获取正确的自动递增 ID
【发布时间】:2010-12-21 15:16:10
【问题描述】:

我在 ORACLE 数据库表中插入一行,其中 主键 ID 是自增的。 和 我正在从该表中检索自动递增的 ID。

如果多人使用同一个 TABLE。 我可能会遇到消费者生产者问题 获取其他用户的 ID。

SO 上的一些用户提到获取这些递增的 ID 基于connection,这不会导致消费者生产者 问题:

只想用 SO 检查以下内容:

第一:

我会从下面的场景中获得准确的自动增量 ID:

1) Two computer with in different subnet using DB.
2) Two computer wiht in same subnet using DB.
3) Two process using using DB connection.
4) Two thread uisng DB connection.

第二

 If my insert is:
 Insert into Tables (ID,NAME,DESCRIPTION) values (DBNull,'Name','Description');

 What should be my query to get the autoincremented ID generated for above
 Insert.

C# related command will do much help :)

【问题讨论】:

    标签: c# database oracle primary-key


    【解决方案1】:

    你应该使用returning子句:

    declare
        v_id TABLES.ID%TYPE;
    begin
        Insert into Tables (ID,NAME,DESCRIPTION)
        values (seq.nextval,'Name','Description')
        RETURNING id INTO v_id;
    --
        dbms_output.put_line(v_id);
    end; 
    

    这样您就可以获得实际插入的 ID,而不必重新查询最高 ID 并希望它是正确的。

    【讨论】:

    • 抱歉回复晚了。我猜你在谈论存储过程。但我不能改变数据库端的任何东西
    【解决方案2】:

    首先,没有像“自动递增”ID 这样的生物。 Oracle 有序列和触发器。可以使用触发器在插入时选择序列值。 Oracle 不保证序列生成的顺序,也不保证值没有间隙。它确实保证您将获得独特的价值。所以实际上没有查询可以告诉您最后一个序列添加到表中的是什么。 MAX 可能是正确的,但是从序列缓冲区中提取并在插入之前延迟的较小数字可能会出现在较大数字之后。

    克雷格有正确的方法来做这件事的最佳答案。遗漏的是对您的四种情况的讨论。

    您需要阅读ACID

    ACID(原子性、一致性、 隔离,耐久性)是一组 保证数据库的属性 交易得到可靠处理。

    而您的代码可能存在并发问题(即竞争条件或不是线程安全的)数据库不存在此类问题。 (不应该也通常不会)好的数据库是从头开始设计的,以满足 ACID 的需求。每个事务都与其他事务隔离。如果您插入该表并在同一事务中选择 Max(ID),然后我插入该表并选择 MAX(ID) 作为我的一个事务的一部分,我将看到我插入的数字,您将看到您插入的数字.任何给定的事务将仅显示事务开始时存在的数据。

    您可以通过更改隔离级别来覆盖此功能,但 ACID 是一件好事。你要这个。长期以来,Oracle 一直都是这样工作的。

    在设计不佳的数据库中,隔离是通过锁完成的。如果您读取一行并保持事务打开,为了确保您的下一次读取相同,您请求的行将被锁定。这意味着读者可以阻止作者——这是一件坏事。在 Oracle 中,从版本 5 或 6 开始,Oracle 已经能够通过MultiVersion Concurrency Control 在事务开始时重新创建表中数据的视图。近 2 年来,这一直是 Oracle 的默认行为。并非每个数据库都如此先进...在对数据库进行任何操作之前,请确保您了解正在使用的隔离级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2010-10-04
      相关资源
      最近更新 更多