事务是一个原子的工作单位,必须完整的完成单位里的所有工作,要么全部执行,要么全部都不执行。如果提交事务,则事务执行成功;如果回滚事务,则事务执行失败。 事务具备4个基本特性--ACID(原子性、一致性、孤立性和持久性)。

在Linq to SQL中,有三种方法创建事务:

  1. 如果没有指定任何事务,那么当调用SubmitChanges方法时,DataContext会默认创建一个事务。
  2. 使用TransactionScope创建轻量级事务
  3. 给DataContext的Transaction属性指定事务

下面我用代码分别来说明这几种创建事务的方法,以Northwind数据库为例,先来看看直接使用SubmitChanges:

 NorthwindDataContext ctx = new NorthwindDataContext();Customer c1 = new Customer { CustomerID = "TESTA", CompanyName = "testa's company" };Customer c2 = new Customer { CustomerID = "TESTBC", CompanyName = "testb's company" };ctx.Customers.Add(c1);ctx.Customers.Add(c2);ctx.SubmitChanges();

上面这段代码中,先创建了两个Customer对象然后添加到DataContext里面,其中的c2的CustomerID赋值为"TESTBC",长度为六个字符,而数据库中该字段约束为5个字符长度,这样在SubmitChanges的时候应该会有异常抛出。果然在执行的时候抛出了SqlException,提示字符将被截断。

再通过Sql Server管理器可以看到上面这两条数据都没有被插入到数据库中。通过Reflector可以发现在SubmitChanges的时候,Linq to SQL默认创建了一个孤立级别为Read Committed的事务(它表示已提交的更新在事务间是可见的,具体有哪些孤立级别可以参考ADO.NET相关资料):

 public virtual void SubmitChanges(ConflictMode failureMode){...transaction = this.provider.Connection.BeginTransaction(IsolationLevel.ReadCommitted);this.provider.Transaction = transaction;}
如果不想使用默认的事务设置,比如想改变事务的孤立级别,我们可以给DataContext的Transaction属性赋值,以此使用自定义的事务。
  ctx.Transaction = ctx.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);try{ctx.SubmitChanges();ctx.Transaction.Commit();}catch{ctx.Transaction.Rollback();throw;}finally{ctx.Transaction = null;}

最后一种方式是通过TransactionScope创建轻量级事务,就像在ADO.NET中使用一样:

 using (TransactionScope scope = new TransactionScope()){ctx.SubmitChanges();scope.Complete();}

上面的例子看起来似乎多此一举,因为在SubmitChanges中会创建默认的事务,但是改成下面这样,就只能使用自定义的事务了:

 using (TransactionScope scope = new TransactionScope()){ctx.ExecuteCommand("exec ....");ctx.ExecuteCommand("exec ....");ctx.ExecuteCommand("exec ....");ctx.SubmitChanges();scope.Complete();}

不管ExecuteCommand里面执行了哪些操作,我们都能够指明这些行为和SubmitChanges处于同一个事务中。

Linq to SQL之使用事务相关推荐

  1. Linq to sql并发与事务

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

  2. Linq to SQL 资源

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

  3. LINQ To SQL 语法及实例大全

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

  4. LINQ to SQL语句(1)之Where(抄的好)

    Where操作适用场景:实现过滤,查询等功能.说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操作包括3种形式,分别为简单形式.关 ...

  5. Linq To Sql 练习

    使用LINQ to SQL (第一部分) 2009-05-12 14:33:21|  分类: 默认分类 |  标签: |字号大中小 订阅 什么是LINQ to SQL? LINQ to SQL 是随. ...

  6. LINQ to SQL语句 收藏系列

    KB-Transaction in Linq to SQL  http://blog.darkthread.net/post-2008-05-14-transaction-in-linq-to-sql ...

  7. C# LINQ TO SQL

    LINQ to SQL语句(1)之Where   Where操作   适用场景:实现过滤,查询等功能.   说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它 ...

  8. Linq to Sql 语句全集

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

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

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

最新文章

  1. ArrayDeque中的取余
  2. mysql 高可用测试_mysql MHA高可用测试
  3. bzoj2299 [HAOI2011]向量 结论 裴蜀定理
  4. AndroidUI 控件命名格式
  5. 前端如何更精准的评估开发时间
  6. 【NodeJs】用WebStorm创建Express项目时出现:express version is unavailable
  7. URLLoader 类和 URLVariables 类
  8. JAVA程序性能优化研究 - 循环内对象性能优化内容
  9. 微信小程序图片上传java后台
  10. ERStudio8.0 破解版 下载 download
  11. ldap 统一认证 java_LDAP统一用户认证
  12. 2020中兴捧月算法大赛参赛总结
  13. Brute-Force模式匹配算法
  14. R语言入门——一文讲明白attach与detach
  15. 使用python绘制图形入门教程
  16. 如何检查计算机上安装的DirectX版本?
  17. navicat创建MySql定时任务详解
  18. 网络爬虫python实例视频-Python网络爬虫实例教程 视频讲解版
  19. 这6个超好用的免费图片素材网站,赶紧收藏~
  20. Cadence Allegro SPB 16.6高速下载+补丁+破解Crack教程

热门文章

  1. JAVA之运算符优先级
  2. while中的break
  3. Linux空硬盘从分区到挂载
  4. Tensorflow模型加载与保存、Tensorboard简单使用
  5. 使用jquery时一些小技巧的总结
  6. photoshop script
  7. r 语言roc_R语言画ROC曲线总结
  8. linux php oauth安装,php – 无法在Linux上安装OAuth
  9. 获取apk安装包sha1的值
  10. 怎么恢复oracle的包,【学习笔记】使用dbms_backup_restore包恢复数据库