LINQ : 在LINQ TO SQL中使用事务和控制并发
2009-07-17 07:35
399 查看
LINQ TO SQL,顾名思义,涉及到了数据库操作。那么就会有一个事务的概念,例如,假设我们需要一次性插入两个实体,但希望保证这两个操作的完整性的话。
1. 隐式事务
其实,即便我们不写代码,LINQ TO SQL也会自动创建一个事务的。默认事务隔离级别为ReadCommitted
2. 显式事务
我们也可以自己写代码,来明确地控制事务,默认事务隔离级别为ReadCommitted
NorthwindDataContext db = new NorthwindDataContext(); db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction(); 。。。。。 db.Transaction.Commit();
db.Connection.Close();
3. 显式分布式事务
我们也可以使用TransactionScope对象,来定义分布式事务。
【注意】TransactionScope的默认隔离级别为可串行化,可能带来并发锁冲突问题。
关于它的详细介绍,有兴趣的朋友可以参考
http://msdn.microsoft.com/zh-cn/library/ms172152(VS.80).aspx
最后大概要谈一下并发控制的问题:这个问题的出现就在于,某些时候,某个客户端读取到了数据,然后它断开了,在本地修改;同时,另外一个客户端也读取到了数据,并且修改并提交了。此时,第一个客户端如果再进行更新,就应该是有所问题的。这就是所谓的并发问题。
LINQ TO SQL通过在submitchanges方法的时候指定ConflictMode来定义并发控制行为
FailOnFirstConflict(默认的)
ContinueOnConflict
下面有一个例子,讲解了并发冲突时继续操作,并且对冲突项进行解决
var query = from p in ctx.Products where p.CategoryID == 1 select p; foreach (var p in query) p.UnitsInStock = Convert.ToInt16(p.UnitsInStock - 1); try { ctx.SubmitChanges(ConflictMode.ContinueOnConflict); } catch (ChangeConflictException) { foreach (ObjectChangeConflict cc in ctx.ChangeConflicts) { Product p = (Product)cc.Object; Response.Write(p.ProductID + "
"); cc.Resolve(RefreshMode.OverwriteCurrentValues); // 放弃当前更新,所有更新以原先更新为准 } } ctx.SubmitChanges();
本文由作者:陈希章 于 2009/7/17 7:35:21 发布在:http://www.cnblogs.com/chenxizhang/
本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
本文是使用博客同步和管理系统自动于2009/7/17 7:35:23 从 陈希章@博客园 同步过来的。原文地址: http://www.cnblogs.com/chenxizhang/archive/2009/07/17/1525258.html ,发表于2009/7/16 23:35:00.
1. 隐式事务
其实,即便我们不写代码,LINQ TO SQL也会自动创建一个事务的。默认事务隔离级别为ReadCommitted
2. 显式事务
我们也可以自己写代码,来明确地控制事务,默认事务隔离级别为ReadCommitted
NorthwindDataContext db = new NorthwindDataContext(); db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction(); 。。。。。 db.Transaction.Commit();
db.Connection.Close();
3. 显式分布式事务
我们也可以使用TransactionScope对象,来定义分布式事务。
【注意】TransactionScope的默认隔离级别为可串行化,可能带来并发锁冲突问题。
关于它的详细介绍,有兴趣的朋友可以参考
http://msdn.microsoft.com/zh-cn/library/ms172152(VS.80).aspx
最后大概要谈一下并发控制的问题:这个问题的出现就在于,某些时候,某个客户端读取到了数据,然后它断开了,在本地修改;同时,另外一个客户端也读取到了数据,并且修改并提交了。此时,第一个客户端如果再进行更新,就应该是有所问题的。这就是所谓的并发问题。
LINQ TO SQL通过在submitchanges方法的时候指定ConflictMode来定义并发控制行为
FailOnFirstConflict(默认的)
ContinueOnConflict
下面有一个例子,讲解了并发冲突时继续操作,并且对冲突项进行解决
var query = from p in ctx.Products where p.CategoryID == 1 select p; foreach (var p in query) p.UnitsInStock = Convert.ToInt16(p.UnitsInStock - 1); try { ctx.SubmitChanges(ConflictMode.ContinueOnConflict); } catch (ChangeConflictException) { foreach (ObjectChangeConflict cc in ctx.ChangeConflicts) { Product p = (Product)cc.Object; Response.Write(p.ProductID + "
"); cc.Resolve(RefreshMode.OverwriteCurrentValues); // 放弃当前更新,所有更新以原先更新为准 } } ctx.SubmitChanges();
本文由作者:陈希章 于 2009/7/17 7:35:21 发布在:http://www.cnblogs.com/chenxizhang/
本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
本文是使用博客同步和管理系统自动于2009/7/17 7:35:23 从 陈希章@博客园 同步过来的。原文地址: http://www.cnblogs.com/chenxizhang/archive/2009/07/17/1525258.html ,发表于2009/7/16 23:35:00.
相关文章推荐
- LINQ : 在LINQ TO SQL中使用事务和控制并发
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ to SQL语句(13)之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ to SQL语句之开放式并发控制和事务
- LINQ to SQL语句(13)之开放式并发控制和事务
- LINQ to SQL语句(13)之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)--LINQ to SQL语句之开放式并发控制和事务
- LINQ体验(10)--LINQ to SQL语句之开放式并发控制和事务
- 一步一步学Linq to sql(七):并发与事务
- 步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理
- Linq to SQL之使用事务
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测 推荐