我想知道在使用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)中创建这种列?什么是正确的列类型?
答案 0 :(得分:1)
通过使用乐观并发=数据库中的rowversion或timestamp列。这些列由数据库维护,并在更新记录时自动更改其值。如果您正确配置EF模型以使用此类进行并发检查,则可以避免一些问题。
当一个进程接受您的订单时,它将加载其当前时间戳,当它尝试保存记录时,时间戳将成为更新的Where条件的一部分。如果订单在同一时间内被另一个进程更改,则无法找到要更新的记录并抛出异常。您将不得不通过刷新数据库中的数据来获取实际状态和实际时间戳,例如通过重新计算qty或将其传递给用户进行解析来处理此类异常。