意外的乐观并发异常

时间:2013-03-27 22:27:34

标签: c# dataset optimistic-concurrency

我尝试更新对象的字段,并立即将其保存到数据库中。

using (var ctx = new DataModel(_connectionString))
{
    var MyObject it = ctx.MyObjects.Where(someConstraint).ToList()[0];
    try
    {
        //update check time
        ctx.Refresh(RefreshMode.StoreWins, it); //making sure I have it
        ctx.AcceptAllChanges(); // in case something else modified it - seems unnecessary
        it.TimeProperty= DateTime.UtcNow; //Setting the field
        ctx.DetectChanges(); //seems unnecessary
        ctx.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); //no SaveOptions changed the behavior
    }
    catch (OptimisticConcurrencyException)
    {
        _logger.DebugFormat(workerClassName + ": another worker just updated the LastCheckTime");
    }
    //Do some other work and/or sleep
}

当我在Azure模拟器中运行2个或更多实例时,我在这里得到了很多OptimisticConcurrencyExceptions。

我正在尝试刷新对象,更新其中一个字段,然后将这些更改推送到数据库。 但是,乐观并发阻止了我。

注意:乐观并发是在我从未触及的TimeStamp字段上设置的。

为什么会这样,我该如何解决?

1 个答案:

答案 0 :(得分:1)

您可能在此try块中有多个线程,在从DB刷新之后但在其中任何一个保存其更改之前修改它们自己的同一实体副本。

试试这个:

using (var ctx = new DataModel(_connectionString))
{
    bool saved = false;

    do
    {
        var MyObject it = ctx.MyObjects.Where(someConstraint).ToList()[0];

        try
        {
            it.TimeProperty= DateTime.UtcNow; //Setting the field
            ctx.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

            saved = true;
        }
        catch (OptimisticConcurrencyException)
        {
            _logger.DebugFormat(workerClassName + ": another worker just updated the LastCheckTime");

            ctx.Refresh(RefreshMode.StoreWins, it);
            ctx.AcceptAllChanges();
       }
    } while( !saved )
    //Do some other work and/or sleep
}

如果这对您有用,请更改while条件以限​​制尝试次数。