【问题标题】:Handle Entity Framework OptimisticConcurrencyException处理实体框架 OptimisticConcurrencyException
【发布时间】:2011-04-13 03:28:09
【问题描述】:

评估 .NET Entity Framework 我试图找到正确的模式来处理具有乐观并发模式的并发更新。

在documentation 和许多其他地方我看到以下模式:

尝试 ' 尝试保存更改,这可能会导致冲突。 Dim num As Integer = context.SaveChanges() Console.WriteLine("没有冲突。" & num.ToString() & " 更新已保存。") 捕获 generatedExceptionName 作为 OptimisticConcurrencyException ' 通过刷新来解决并发冲突 ' 重新保存更改之前的对象上下文。 context.Refresh(RefreshMode.ClientWins, 订单) ' 保存更改。 context.SaveChanges() Console.WriteLine("OptimisticConcurrencyException 已处理并保存更改") 结束尝试

我看到了以下问题

  • 它会自动实现最后获胜,而不是使用乐观模式
  • 它不可靠:.Refresh 和 .SaveChanges 之间的并发更改可能导致新的 OptimisticConcurrencyException

这是正确的,还是我遗漏了什么?

在 UI 中,我通常让用户解决并发冲突:

尝试 _ctx.SaveChanges() 捕获 ex 作为 OptimisticConcurrencyException MessageBox.Show("数据被其他用户修改。" & vbCrLf & "单击“刷新”以显示当前值并重新应用您的更改。", “并发冲突”,MessageBoxButton.OK) 结束尝试

在业务逻辑中,我通常围绕整个业务事务(读取和更新)使用重试循环:

常量 maxRetries = 5,retryDelayMs = 500 对于 i = 1 到 maxRetries 尝试 使用 ctx 作为新的 EFConcurrencyTest.ConcurrencyTestEntities ctx.Inventories.First.QuantityInStock += 1 System.Threading.Thread.Sleep(3000) '引起冲突 ctx.SaveChanges() 结束使用 退出 捕获 ex 作为 OptimisticConcurrencyException 如果 i = maxRetries 则抛出 System.Threading.Thread.Sleep(retryDelayMs) 结束尝试 下一个

我打算用 EF 封装循环:

ExecuteOptimisticSubmitChanges(EFConcurrencyTest.ConcurrencyTestEntities)( 子(ctx) ctx.Inventories.First.QuantityInStock += 1 System.Threading.Thread.Sleep(3000) '引起冲突 结束子)

见:

Functional Optimistic Concurrency in C#

Retryable actions in C#

【问题讨论】:

    标签: .net entity-framework


    【解决方案1】:

    这个:

    Catch ex As OptimisticConcurrencyException
      ' Resolve the concurrency conflict by refreshing the 
      ' object context before re-saving changes. 
      context.Refresh(RefreshMode.ClientWins, orders)
    
      ' Save changes. 
      context.SaveChanges()
      Console.WriteLine("OptimisticConcurrencyException handled and changes saved")
    

    ...完全没有意义。如果您在“处理”异常时唯一要做的就是忽略它并无论如何保存,您应该关闭乐观并发;您正在编写代码来解决可选功能。

    所以,是的,我想说的是这里的文档没有给你很好的建议。

    您提出的 UI 代码是一个更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2013-03-07
      • 1970-01-01
      • 2010-10-02
      • 2014-06-27
      相关资源
      最近更新 更多