没有合适的资源?快使用搜索试试~ 我知道了~
首页Entity Framework 处理并发
Entity Framework 处理并发
2星 需积分: 24 11 下载量 154 浏览量
更新于2023-03-16
评论
收藏 797KB DOCX 举报
并发处理方式一般分为乐观必并发与悲观必并发两种,本文将为大家介绍 Entity Framework 、 LINQ to SQL 中的并发处理方式。在本文最后,将提供一个了可参考的方案,结合事务 Transaction 处理复杂性对象的并发。
资源详情
资源评论
资源推荐
引言
在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制。从
ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都为并发
控制提供好良好的支持方案。
并发处理方式一般分为乐观必并发与悲观必并发两种,本文将为大家介绍 Entity
Framework 、 LINQ to SQL 中的并发处理方式。在本文最后,将提供一个了可参考的
方案,结合事务 Transaction 处理复杂性对象的并发。
目录
一、并发处理的定义..............................................................................................................1
二、模型属性的并发处理选项...............................................................................................2
三、Enty Framework 悲观并发.............................................................................................3
四、Enty Framework 乐观并发.............................................................................................4
4.1 以合并方式处理并发数据.............................................................................................4
4.1.1 同时更新数据..........................................................................................................5
4.1.2 删除与更新操作同时运行......................................................................................7
4.2 当发生数据并发时,保留最新输入的数据...............................................................10
4.3 当发生数据并发时,保留最初输入的数据...............................................................14
五、回顾 LINQ to SQL 并发处理的方式...............................................................................17
六、结合事务处理并发冲突.................................................................................................22
总结........................................................................................................................................25
一、并发处理的定义
在软件开发过程中,当多个用户同时修改一条数据记录时,系统需要预先制定对并发的处
理模式。并发处理模式主要分为两种:
第一种模式称为悲观式并发,即当一个用户已经在修改某条记录时,系统将拒绝其他用户
同时修改此记录。
第二种模式称为乐观式并发,即系统允许多个用户同时修改同一条记录,系统会预先定义
由数据并发所引起的并发异常处理模式,去处理修改后可能发生的冲突。常用的乐观性并
发处理方法有以下几种:
1. 保留最后修改的值。
2. 保留最初修改的值。
3. 合并多次修改的值。
相对于 LINQ TO SQL 中的并发处理方式,Entity Framework 中的并发处理方式实现了
不少的简化,下面为大家一一介绍。
二、模型属性的并发处理选项
在 System.Data.Metadata.Edm 命名空间中,存在 ConcurencyMode 枚举,用于指
定概念模型中的属性的并发选项。
ConcurencyMode 有两个成员:
成员名称 说明
None
在写入时从不验证此属性。 这是默认的
并发模式。
Fixed
在写入时始终验证此属性。
当模型属性为默认值 None 时,系统不会对此模型属性进行检测,当同一个时间对此属性
进行修改时,系统会以数据合并方式处理输入的属性值。
当模型属性为 Fixed 时,系统会对此模型属性进行检测,当同一个时间对属性进行修改时,
系统就会激发 OptimisticConcurrencyException 异常。
开发人员可以为对象的每个属性定义不同的 ConcurencyMode 选项,选项可以在*.csdl
找看到:
1 <Schema>
2 ......
3 ......
4 <EntityType Name="Person">
5 <Key>
6 <PropertyRef Name="Id" />
7 </Key>
8 <Property Type="Int32" Name="Id" Nullable="false"
annotation:StoreGeneratedPattern="Identity" />
9 <Property Type="String" Name="FirstName" MaxLength="50"
FixedLength="false" Unicode="true"
10 ConcurrencyMode="Fixed" />
11 <Property Type="String" Name="SecondName" MaxLength="50"
FixedLength="false" Unicode="true" />
12 <Property Type="Int32" Name="Age" />
13 <Property Type="String" Name="Address" MaxLength="50"
FixedLength="false" Unicode="true" />
14 <Property Type="String" Name="Telephone" MaxLength="50"
FixedLength="false" Unicode="true" />
15 <Property Type="String" Name="EMail" MaxLength="50"
FixedLength="false" Unicode="true" />
16 </EntityType>
17 </Schema>
三、Entity Framework 悲观并发
在一般的开发过程中,最常用的是悲观并发处理。.NET 提供了
Lock、Monitor、Interlocked 等多个锁定数据的方式,它可以保证同一个表里的对象不
会同时被多个客户进行修改,避免了系统数据出现逻辑性的错误。
1 private static object o=new object();
2
3 public int Update(Person person)
4 {
5 int n = -1;
6 try
7 {
8 lock (o)
9 {
10 using (BusinessEntities context = new BusinessEntities())
11 {
12 var obj = context.Person.Where(x => x.Id ==
person.Id).First();
13 if (obj != null)
14 context.ApplyCurrentValues("Person", person);
15 n = context.SaveChanges();
16 }
17 }
18 }
19 catch (Exception ex)
20 { ...... }
21 return n;
22 }
使用悲观并发虽然能有效避免数据发生逻辑性的错误,但使用 lock 等方式锁定 Update
方法的操作,在用户同时更新同一数据表的数据,操作就会被延时或禁止。在千万级 PV
的大型网络系统当中使用悲观并发,有可能降低了系统的效率,此时可以考虑使用乐观并
发处理。
四、Entity Framework 乐观并发
为了解决悲观并发所带来的问题,ADO.NET Entity Framework 提供了更为高效的乐观
并发处理方式。相对于 LINT to SQL , ADO.NET Entity Framework 简化了乐观并发的
处理方式,它可以灵活使用合并数据、保留初次输入数据、保留最新输入数据等方式处理
并发冲突。
4.1 以合并方式处理并发数据
当模型属性的 ConcurencyMode 为默认值 None ,一旦同一个对象属性同时被修改,系
统将以合并数据的方式处理并发冲突,这也是 Entity Framework 处理并发冲突的默认方
式。合并处理方式如下:当同一时间针对同一个对象属性作出修改,系统将保存最新输入
的属性值。当同一时间对同一对象的不同属性作出修改,系统将保存已被修改的属性值。
下面用两个例子作出说明:
4.1.1 同时更新数据
在系统输入下面代码,获取数据库中的 Person:Id 为 24,FirstName 为 Leslie,
SecondName 为 Lee。然后使用异步方法分两次调用 Update 方法,同时更新 Person
对象的相关属性,第一次更新把对象的 FirstName 属性改 Rose,第二次更新把对象的
SecondName 改为 Wang,Age 改为 32。在使用 SaveChanges 保存更新时,第一个
方法已经把 ObjectContext1 中的 FirstName 修改为 Rose,但在第二个方法中的
ObjectContext2 中的 FirstName 依然是 Leslie,此时由于三个属性的
ConcurencyMode 都为默认值 None,系统会忽略当中的冲突,而接受所有的更新修改。
1 public class PersonDAL
2 {
3 public Person GetPerson(int id)
4 {
5 using (BusinessEntities context = new BusinessEntities())
6 {
7 IQueryable<Person> list=context.Person.Where(x => x.Id ==
id);
8 return list.First();
9 }
10 }
11
12 public void Update(Person person)
13 {
14 using (BusinessEntities context = new BusinessEntities())
15 {
16 //显示输入新数据的信息
17 Display("Current", person);
18 var obj = context.Person.Where(x => x.Id == person.Id).First();
19 if (obj != null)
20 context.ApplyCurrentValues("Person", person);
21
22 //虚拟操作,保证数据能同时加入到上下文当中
23 Thread.Sleep(100);
24 context.SaveChanges();
25 }
26 }
27
28 delegate void MyDelegate(Person person);
29
30 public static void Main(string[] args)
31 {
32 //在更新数据前显示对象信息
剩余24页未读,继续阅读
wwejie
- 粉丝: 2
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1