c#

位置:IT落伍者 >> c# >> 浏览文章

ADO.NET Entity Framework 试水——并发[4]


发布日期:2023年09月19日
 
ADO.NET Entity Framework 试水——并发[4]

laptopBrand = Lenovo ThinkPad

laptopType = laptopType & A

Submit st object context

objContextSaveChanges()

Try

Submit nd object context and cause cuncurrency exception

objContextSaveChanges()

Catch ex As OptimisticConcurrencyException

Using refresh method to

objContextRefresh(ObjectsRefreshModeStoreWins laptop)

We should load the new data from db and ask user to change it again

objContextSaveChanges()

End Try

我们创建了两个Object Context分别查询出了同一个实体第一个修改其品牌为Lenovo ThinkPad第二个同时将其型号修改为T A然后第一个实体保存然后第二个保存由于我们在Brand属性上设置了Concurrency Mode为Fixed而此时laptop中的Brand属性的值应该是一开始取得的T而数据库里的值是Lenovo T于是系统就会抛出OptimisticConcurrencyException(开放式并发异常)当程序捕获到异常以后就可以使用Object Context的Refresh方法对异常采取处理由于没有在刷新laptop以后未对其作任何修改故最终结果将与laptop提交时的结果一致

这里Refresh的第一个参数值得注意一下它是一个枚举值有两个选项StoreWins或者是ClientWins见名知义如果是StoreWins那么Refresh以后laptop的值将与数据库里的对应记录的值一致(修改会丢失)而如果ClientWins则laptop的值保持并且提交以后会把objContext提交的修改覆盖

其实这两种方法均不完美总会导致一部分修改丢失但是这总比在不知情的情况下的覆盖要好

另外需要说明上面的方法只是对并发沖突的一种模拟这样的模式在处理并发沖突时会有问题一般的处理方法是当检测到并发沖突时提示用户会重新从数据库载入数据然后让用户在新数据的情况下重新修改后再次提交直到不再有并发沖突发生

这样看似可能成为一个无穷尽的痛苦的过程但实际上由于这种处理方式是基于对并发沖突的乐观估计来设计的因此当我们认为并发沖突很少有可能发生时这种处理方式可以有效避免数据被无意识的覆盖问题

示例代码下载

点击下载

http://filescnblogscom/xiaomi/Concurrencyzip

[] [] [] []

               

上一篇:ADO.NET Entity Framework 试水——并发[2]

下一篇:ADO.NET实用技巧两则