如何在EF4中处理并发(ORACLE)

时间:2012-06-14 08:19:02

标签: c# oracle entity-framework odac

我想知道在使用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)中创建这种列?什么是正确的列类型?

1 个答案:

答案 0 :(得分:1)

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

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