【发布时间】: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) '引起冲突 结束子)见:
【问题讨论】:
标签: .net entity-framework