0

我想知道在使用 Entity Framework 4(ODAC) 编程时如何安全地更新数据。

void DescreaseInventory(int id, int qty){
  var order = (from o in context.Orders where o.ID ==id select o).FirstOrDefault;
  if( order != null ){
    if( ((Order)order).Qty < qty )
      throw new ApplicationException( "Not Enough Inventory!!" );
    else
      ((Order)order).Qty -= qty;
  }
  else{
  //...some code...
  }
  //will content.savechange
}

一旦发生竞争条件,此代码将是危险的(逃避数量检查)。谁知道如何正确地做到这一点?

编辑:现在我知道 EF4 提供了一种将列作为跟踪令牌的机制。但我不确定如何在 oracle DB(9i) 中创建这种列?什么是正确的列类型?

4

1 回答 1

1

通过使用乐观并发 = 数据库中的 rowversion 或 timestamp 列。这些列由数据库维护,并在更新记录时自动更改它们的值。如果您正确配置 EF 模型以使用此类列进行并发检查,您将避免一些问题。

当一个进程接受您的订单时,它将加载其当前时间戳,并且当它尝试保存记录时,时间戳将成为更新的 Where 条件的一部分。如果订单同时被另一个进程更改,它将找不到要更新的记录并抛出异常。您将不得不通过刷新数据库中的数据以获取实际状态和实际时间戳来处理此类异常,例如通过重新计算数量或将其传递给用户进行解析。

于 2012-06-14T08:31:25.453 回答