增量函数没有得到下一个序列值

本文关键字:下一个 函数 | 更新日期: 2023-09-27 18:13:36

当我尝试用NHibernate保存一个实体时,我得到以下错误:

System.Data.OracleClient.OracleException (0x80131938): ORA-00001: unique constraint (FEMADEV.TRN_INFLOW_DETAILS_HIS_PK) violated

My Controller Code:

TrnInflowDetailsHis trnInflowDetailsHis = Mapper.Map<TrnInflowDetailsHis>(trnInflowDetailsAud);
trnInflowDetailsHis.InflowSeq = trnInflowDetailsAud.Id;
trnInflowDetailsHisService.Add(trnInflowDetailsHis);

映射代码:

 public class TrnInflowDetailsHisMap : ClassMap<TrnInflowDetailsHis>
 {
    public TrnInflowDetailsHisMap()
    {
        Table("TRN_INFLOW_DETAILS_HIS");
        LazyLoad();
        Id(x => x.Id).Column("INFLOW_ID").GeneratedBy.Increment();
        Map(x => x.InflowSeq).Column("INFLOW_SEQ");
        Map(x => x.TranRef).Column("TRAN_REF");
        Map(x => x.Currency).Column("CURRENCY");
     }
  }

这里的问题是,GeneratedBy.Increment()工作良好,但有时它不增加下一个序列值。我不知道是什么问题。所以请任何人帮助我找到解决方案。

增量函数没有得到下一个序列值

我怀疑问题更多是关于多并发实例,而不是increment生成器中的错误

例外ORA-00001意味着:

UPDATE或INSERT语句试图插入重复键。对于在DBMS MAC模式下配置的可信Oracle,如果在不同级别存在重复条目,您可能会看到此消息。

换句话说,有人已经插入ID值,当前线程试图使用。这很容易发生在多应用程序实例访问相同的数据库与ID生成器Increment

文档5.1.5.1。发电机:

增量
  • 生成任何整数类型的标识符,这些标识符只有在没有其他进程向同一表插入数据时才唯一。

所以,只需将这个生成器更改为其他任何东西。increment可能用于开发,或者用于几乎不可变的类型。或者,如果您可以确定,一次只有一个实例(一个应用程序)在运行。

相关文章: