entity framework中的并发exception
在Entity Framework(CF,C#)中调用SaveChanges
/ SaveChangesAsync
时,如果发生更改冲突(例如,自上次读取之后值已更新),那么我应该捕获这两个exception中的DbUpdateConcurrencyException
或OptimisticConcurrencyException
?
它们之间有什么区别?
DbUpdateConcurrencyException
是DbUpdateConcurrencyException
抛出的特定exception,因此这是要捕获的exception。 此exception可能是由基础OptimisticConcurrencyException
引起的,但如果是这样,则此exception将作为内部exception包装。
并非所有更新exception都是由并发引起的,因此在捕获DbUpdateException
之后还必须捕获DbUpdateConcurrencyException
(因为后者是DbUpdateException
的子类型)。
另请参见Entity framework 5.0处理乐观并发exception? 。
您将获得OptimisticConcurrencyException
。 看看这个 。
现在变得不同了。
- OptimisticConcurrencyException :在发生乐观并发冲突时抛出(假设多个perople正在更改为相同的结果,这将导致不同步的问题)
- DbUpdateConcurrencyException :当预期的行为是实体的SaveChanges将导致数据库更新但实际上数据库中没有行受到影响时,DbContext抛出exception。 这表明数据库已同时更新,并且预期匹配的并发令牌实际上不匹配。 由于安全性和序列化后对状态条目的访问将返回null,因此此exception引用的状态条目未被序列化。