【问题标题】:Does running a query inside a transaction guarantee the uniqueness of the generated number?在事务中运行查询是否保证生成数字的唯一性?
【发布时间】:2015-04-05 14:40:12
【问题描述】:

当我更改 OnlinePayment 时,我想为记录创建一个唯一的 InvoiceNumber。此代码将生成一个唯一的 id:

int newId = db.OnlinePayments.Max(op => op.InvoiceNumber) + 1;

但是,如果同时添加另一条记录,这将失败。使用Identity 列不是一个选项,因为每当我更改数据库时InvoiceNumber 都应该更改。下面的代码能保证生成的InvoiceNumber 的唯一性吗?

using (var transaction = db.Database.BeginTransaction())
{
    try
    {
        int newId = db.OnlinePayments.Max(op => op.InvoiceNumber) + 1;
        opi.InvoiceNumber = newId;
        await db.SaveChangesAsync();

        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
    }
}

【问题讨论】:

  • 有点不清楚....GUID? Random Number Generator (RNG)?想到...
  • 为什么不使用InvoiceNumber 作为标识列?
  • @ArindamNayak 我相信我在上面回答了你的问题。
  • @AlirezaNoori 我真的不明白你的推理,你所说的“因为 InvoiceNumber 应该在我更改数据库时更改”是什么意思?
  • 如果我将列设置为Identity,当我无法手动更改值并且我希望每次修改记录时都更改它。假设有一条记录包含1Id10InvoiceNumber。现在,当我更改此记录时,InvoiceNumber 应该更改为 11Identity 不允许这样做。至少我不知道怎么做。

标签: asp.net asp.net-mvc entity-framework entity-framework-6


【解决方案1】:

不,因为两个事务都可以读取相同的最大值,然后都使用该值加一。

【讨论】:

  • 那我该怎么做呢?
  • 我现在找不到一个好的规范问题。也许你应该问它。 “如何使用实体框架生成连续的顺序 ID?”。
  • 是的,我想要顺序 ID,但我希望在修改记录时更改它们。正如我在上面对 Martin 所说的,如果有 Id1InvoiceNumber10 的记录。现在,当我更改此记录时,InvoiceNumber 应该更改为 11
  • 这与问题无关。我按要求回答了这个问题,并解释了为什么不能依赖这个问题。问另一个问题。您可以提出的问题数量没有限制。不要破坏现有问题。
  • 这就是我要找的。也许我需要将此添加到我的问题中以进行更多解释。而且我认为标题与我解释的内容非常相关
猜你喜欢
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多