Linq to SQL支持三种事务处理模型:显式本地事务、显式可分发事务、隐式事务

1. 隐式事务

当调用SubmitChanges 时,L2S会检查当前环境是否开启了事务(下面两节中创建的事务),如果没有开始事务,则 L2S启动本地事务(IDbTransaction),并使用此事务执行所生成的 SQL 命令。

使用Reflector查看DataContext.SubmitChanges的源代码(见本文最后的附录),可以看到,如果开启了一个事务,并将其传给DataContext.Transaction,则在执行SubmitChanges时就不会再重新开启一个新的事务了。

进行此调用时,DataContext 会设法将您所做的更改转换为等效的 SQL 命令。您可以使用自己的自定义逻辑来重写这些操作,但提交顺序是由 DataContext 的一项称作“更改处理器”的服务来协调的。事件的顺序如下:

  1. 当您调用 SubmitChanges 时,LINQ to SQL 会检查已知对象的集合以确定新实例是否已附加到它们。如果已附加,这些新实例将添加到被跟踪对象的集合。

  2. 所有具有挂起更改的对象将按照它们之间的依赖关系排序成一个对象序列。如果一个对象的更改依赖于其他对象,则这个对象将排在其依赖项之后。

  3. 在即将传输任何实际更改时,LINQ to SQL 会启动一个事务来封装由各条命令组成的系列。

  4. 对对象的更改会逐个转换为 SQL 命令,然后发送到服务器。

此时,如果数据库检测到任何错误,都会造成提交进程停止并引发异常。将回滚对数据库的所有更改,就像未进行过提交一样。DataContext 仍具有所有更改的完整记录。

先执行Insert,再执行Update;执行Update时出现了SqlException异常。这时查看测试表TLINQ中的数据,发现没有插入新的记录进去。也就是说,这里使用了事务,但是SQL Server Profile没有跟踪到
    下面一节中即使执行DbConnection.BeginTransaction(),也不会跟踪到begin tran和commit tran。

最后总结一下隐式事务的优缺点:

    优点:使用简单,L2S都帮我们搞定了,我们不需要写任何代码。

    缺点:只能处理单个DataContext中的单个SubmitChanges()函数的调用。如果需要将SubmitChanges()与其他自定义更新操作(譬如ExcuteCommand)共用一个Transaction、或者与其他DataContext共用一个DBTransation

2. 显式本地事务

SubmitChanges只能处理最基本的CUD(Create/Update/Delete)操作;而在日常的应用中,逻辑往往没有这么简单,或者考虑性能等因素,我们需要配合ADO.Net执行原生的TSQL;这时我们可能要让ADO.Net + Linq to SQL来进行配合处理。

也就是说,我们可以手工创建一个DbConnection和DbTransaction,然后传给DataContext

  优点:可以配合Ado.Net一起使用,或者跨DataContext使用,实现负责的业务逻辑。

    缺点:处理步骤比较繁琐。L2S中的DataContext已经提供了ExcuteCommand方法来执行原生的TSQL

3. 显式可分发事务

使用TransactionScope来进行显示可分发事务控制。于是这个操作就有了事务功能。关于TransactionScope的详细介绍,可以参考MSDN:使用事务范围实现隐式事务,及SQL Server的联机丛书:CLR 集成和事务

简洁,把要执行的操作封装在一个或多个Action中,然后传递给TransactioExtension.Excute即可。对于封装在TransactionScope里面执行的所有操作(譬如SubmitChanges,ExcuteCommand、ExecuteQuery),最终都会解析为对ADO.NET的调用;而ADO.Net会在调用 Connection.Open 方法时自动检查Transaction.Current,并在该事务中以透明方式登记连接(除非在连接字符串中将 Enlist 关键字设置为 false)。

    SqlConnection 对象的 ConnectionString 属性支持 Enlist 关键字,该关键字指示 System.Data.SqlClient 是否检测事务上下文并在分布式事务中自动登记连接。如果此关键字设置为 True(默认设置),则会在打开的线程的当前事务上下文中自动登记连接。如果此关键字设置为 False,则 SqlClient 连接不会与分布式事务交互。如果未在连接字符串中指定 Enlist,并且如果在打开相应连接时检测到一个分布式事务,则会在此分布式事务中自动登记此连接

    优点:使用简单,可以配合ADO.Net或者DataContext.ExcuteCommand使用,可以跨DataContext使用,可以跨数据库使用,可以跨服务器使用。

    缺点:分布式事务通常会使用大量的系统资源。Microsoft 分布式事务处理协调器 (MS DTC) 会管理此类事务,并集成在这些事务中访问的所有资源管理器。庆幸的是:在打开一个具有活动TransactionScope事务的连接而未打开任何其他连接的情况下,该事务会以轻型事务的形式提交,而不是产生完全分布式事务的额外开销。

Linq to Sql 事务处理相关推荐

  1. Linq to Sql : 三种事务处理方式

    Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from  MSDN: 事务 (LINQ to SQL)).MSDN中描述得相对比较粗狂,下面就结合实例来对此进行 ...

  2. .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理

    步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理 作者:webabcd 介绍 以Northwind为示例数据库,DLINQ(LINQ ...

  3. 一步一步学Linq to sql(七):并发与事务

      检测并发 首先使用下面的SQL语句查询数据库的产品表: select * from products where categoryid=1 查询结果如下图: 为了看起来清晰,我已经事先把所有分类为 ...

  4. ScottGu之博客翻译-LINQ to SQL第四部分,更新数据库 LINQ to SQL (Part 4 - Updating our Database)...

    原贴链接: http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.asp ...

  5. (LINQ 学习系列)(8)Linq教程实例: 事务处理

    Linq to sql在提交更新的时候默认会创建事务,一部分修改发生错误的话其它修改也不会生效 下面是插入2个表中的数据进行事务处理 private void TransAdd()         { ...

  6. Linq to SQL 语法记录....并发写事务

    检测并发 首先使用下面的SQL语句查询数据库的产品表: select * from products where categoryid=1 var query = from p in ctx.Prod ...

  7. Linq to sql并发与事务

    本文转载:http://www.cnblogs.com/lovecherry/archive/2007/08/20/862365.html 检测并发 首先使用下面的SQL语句查询数据库的产品表: se ...

  8. 如何查看Linq to SQL运行时,实际执行的Sql语句

    调试Linq to sql代码是, 如果遇到错误,很难判断错误的原因是什么,如果能够输出实际执行的sql原文,对于我们寻找错误的原因有有很大帮助. 以下是我用到的方法: StringBuilder s ...

  9. Linq to SQL 资源

    Scott Guthrie 的 Linq to SQL 系列: 1)介绍 http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to ...

最新文章

  1. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)
  2. 8.腾讯微博Android客户端开发——自动获取验证码(2)
  3. Qt Creator使用语言服务器
  4. Hadoop学习总结:Map-Reduce的过程解析
  5. centos7 elk7.1.1安装
  6. JavaScript——变量与基本数据类型
  7. tp中怎么执行mysql事务_tp中使用事务
  8. .NET二级域名共享Session
  9. 自动化调参NNI学习(三):使用python启动NNI框架调整随机森林(RandomForest)模型
  10. Ubuntu系统中创建虚拟环境
  11. Dynamica AX2012 Tmp Table or Form 获取数据
  12. 【程序人生】程序员接私活常用平台汇总
  13. 小莫微信影视机器人-自定义对接影视教程
  14. OpenLdap-如何使用phpLdapAdmin创建CN用户、OU用户组
  15. 计算机vb输入框函数,VB基本函数大全
  16. Java根据出生日期判断星座
  17. Vine已死,秒拍抱团崛起,同是视频社交差距在哪?
  18. 如何统计序列中元素的出现的频度
  19. 「衡水中学语录分享」喜欢点波关注呗
  20. 到底什么是服务器托管

热门文章

  1. saturn pcb toolkit相关功能界面介绍
  2. 国内计算机博士去百度云,于博士Cadence视频教程60集全套百度网盘分享
  3. 玩转华为ENSP模拟器系列 | 配置LDP自动触发DoD请求功能示例
  4. 【CSS】笔记3-三大样式、盒子模型、PS、圆角、阴影
  5. 1-2 认识905.4王国的交流规范
  6. BRENDAN MCCAFFREY:自行车大师
  7. android studio中光线传感器解析
  8. 壳聚糖修饰的雷公藤多苷聚乳酸纳米粒(LMWC-TG-PLA-NPs)齐岳规格信息
  9. 阿西莫夫机器人三原则
  10. 8.HPA自动扩缩容