【发布时间】:2014-11-18 22:22:03
【问题描述】:
我有以下场景:
使用 ef6 的业务逻辑函数检查记录是否已存在。如果记录不存在,则将其插入到数据库中。
类似的东西
if (!product.Skus.Any(s => s.SkuCodeGroup == productInfo.SkuCodeGroup && s.SkuCode == productInfo.SkuCode))
AddProductSku();
我有多个线程调用这个业务逻辑函数。会发生什么:
如果使用相同的参数同时调用函数,则两个实例都会检查记录是否存在 - 并且不存在。所以两个实例都插入了相同的记录。
在第一个实例上调用 context.SaveChanges() 时,一切正常。但是第二个 SaveChanges() 会抛出异常,因为记录已经存在(数据库上有唯一索引)。
如何实现这一点以避免异常?
我通过使用锁 {} 解决了这个问题,但它造成了我不想要的瓶颈。
谢谢。
【问题讨论】:
标签: .net multithreading entity-framework entity-framework-6