个人理解就是: 吧一些方法封装在TransactionScope里面,如果全部执行成功 那么事务就会提交 方法执行,加入其中一个方法不成功,事务就会自动回滚。代码重用性高

TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间。它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物。使用之前必须添加对 System.Transactions.dll 的引用。

下列代码就是一个正在创建的事务,这个事务自身还封装了多个数据库查询。只要任意一个 SqlCommand 对象引发异常,程序流控制就会跳出 TransactionScope 的 using 语句块,随后,TransactionScope 将自行释放并回滚该事务。由于这段代码使用了 using 语句,所以 SqlConnection 对象和 TransactionScope 对象都将被自动调用Dispose()释放。由此可见,只需添加很少的几行代码,您就可以构建出一个事务模型,这个模型可以对异常进行处理,执行结束后会 自行清理,此外,它还可以对命令的提交或回滚进行管理。

//创建TransactionScope
using (TransactionScope tsCope= new TransactionScope()) {  using (SqlConnection cn2005= new SqlConnection(someSql2005))
 {
SqlCommand cmd= new SqlCommand(sqlUpdate, cn2005);  cn2005.Open();
cmd.ExecuteNonQuery();  }
using (SqlConnection cn2005= new SqlConnection(anotherSql2005)) {  SqlCommand cmd= new SqlCommand(sqlDelete, cn2005);
 cn2005.Open();
cmd.ExecuteNonQuery();  }
 tsCope.Complete();
}

连接字符串关键字(Enlist)
       SqlConnection.ConnectionString 属性支持关键字 Enlist,该关键字指示 System.Data.SqlClient 是否将检测事务上下文并自动在分布式事务中登记连接。 如果 Enlist=true,连接将自动在打开的线程的当前事务上下文中登记。 如果 Enlist=false,SqlClient 连接不会与分布式事务进行交互。 Enlist 的默认值为 true。 如果连接字符串中未指定 Enlist,若在连接打开时检测到一个,连接将自动在分布式事务中登记。

Server=(local)SQL2005;Database=Northwind;Integrated Security=SSPI;auto-enlist=false

上面所看到的示例中我们使用了TransactionScope的默认设置。TransactionScope有三种模式:

TransactionScopeOptions

描述

Required

如果已经存在一个事务,那么这个事务范围将加入已有的事务。否则,它将创建自己的事务。

RequiresNew

这个事务范围将创建自己的事务。

Suppress

如果处于当前活动事务范围内,那么这个事务范围既不会加入氛围事务 (ambient transaction),也不会创建自己的事务。当部分代码需要留在事务外部时,可以使用该选项。

您可以在代码的任何位置上随是查看是否存在事务范围,具体方法就是查看 System.Transactions.Transaction.Current 属性。如果这个属性为“null”,说明不存在当前事务。
       若要更改 TransactionScope 类的默认设置,您可以创建一个 TransactionOptions 对象,然后通过它在 TransactionScope 对象上设置隔离级别和事务的超时时间。TransactionOptions 类有一个 IsolationLevel 属性,通过这个属性可以更改隔离级别,例如从默认的可序列化 (Serializable) 改为ReadCommitted,甚至可以改为 SQL Server 2005 引入的新的快照 (Snapshot) 级别。(请记住,隔离级别仅仅是一个建议。大多数数据库引擎会试着使用建议的隔离级别,但也可能选择其他级别。)此 外,TransactionOptions 类还有一个 TimeOut 属性,这个属性可以用来更改超时时间(默认设置为 1 分钟)。
       下列代码中使用了默认的 TransactionScope 对象及其默认构造函数。也就是说,它的隔离级别设置为可序列化 (Serializable),事务的超时时间为 1 分钟,而且 TransactionScopeOptions 的设置为 Required。

TransactionOptions tOpt= new TransactionOptions();
//设置TransactionOptions模式
tOpt.IsolationLevel= IsolationLevel.ReadCommitted;
// 设置超时间隔为2分钟,默认为60秒
tOpt.Timeout= new TimeSpan(0,2,0);
string cnString= ConfigurationManager.ConnectionStrings["sql2005DBServer"].ConnectionString);
using (TransactionScope tsCope= new TransactionScope(TransactionScopeOption.RequiresNew, tOpt))
{
using (SqlConnection cn2005= new SqlConnection(cnString)
{
SqlCommand cmd= new SqlCommand(updateSql1, cn2005);
cn2005.Open();
cmd.ExecuteNonQuery();
}
tsCope.Complete();
}

嵌套应用
      如下列代码,假设 Method1 创建一个 TransactionScope,针对一个数据库执行一条命令,然后调用 Method2。Method2 创建一个自身的 TransactionScope,并针对一个数据库执行另一条命令。

private void Method1()
{
using (TransactionScope ts=
new TransactionScope(TransactionScopeOption.Required))
{
using (SqlConnection cn2005= new SqlConnection())
{
SqlCommand cmd= new SqlCommand(updateSql1, cn2005);
cn2005.Open();
cmd.ExecuteNonQuery();
}
Method2();
ts.Complete();
}
}
private void Method2()
{
using (TransactionScope ts=
new TransactionScope(TransactionScopeOption.RequiresNew))
{
using (SqlConnection cn2005= new SqlConnection())
{
SqlCommand cmd= new SqlCommand(updateSql2, cn2005);
cn2005.Open();
cmd.ExecuteNonQuery();
}
ts.Complete();
}
}

总结:
       进入和退出事务都要快,这一点非常重要,因为事务会锁定宝贵的资源。最佳实践要求我们在需要使用事务之前再去创建它,在需要对其执行命令前迅速打开连接, 执行动作查询 (Action Query),并尽可能快地完成和释放事务。在事务执行期间,您还应该避免执行任何不必要的、与数据库无关的代码,这能够防止资源被毫无疑义地锁定过长的 时间。

TransactionScope事务相关推荐

  1. c#传统SqlTransaction事务和TransactionScope事务

    事务有很多种,看了一些关于事务的问题,这里做下笔记····· 事务时单个的工作单位.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中永久的组成部分.若果事务遇到错误,则必须取消或 ...

  2. EF 多线程TransactionScope事务异常事务(进程 ID 58)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

    在使用EF的TransactionScope事务时,如果多线程程序,经常会抛出如下异常 {"事务(进程 ID 58)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品.请重新运行该事务 ...

  3. TransactionScope事务简介

    在.NET 1.0/1.1 版本我们使用SqlTransaction.处理事务 string connString = ConfigurationManager.ConnectionStrings[& ...

  4. 【转】TransactionScope事务简介

    在.NET 1.0/1.1 版本我们使用SqlTransaction.处理事务 string connString = ConfigurationManager.ConnectionStrings[& ...

  5. TransactionScope 事务使用说明

    TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间.它的用途是为数据库访问提供了一个"轻量级"[区别于:SqlTransaction]的 ...

  6. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)

    一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ...

  7. .net EF 事务TransactionScope和BeginTransaction的用法

    事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操作都将回滚.在EF使用事务有两种方案,一种是EF自带的.BeginTransaction()方法,另一种是使用Transaction ...

  8. .net mysql transactionscope_C#中的事务TransactionScope

    TransactionOptions transactionOption = newTransactionOptions();//设置事务隔离级别 transactionOption.Isolatio ...

  9. 数据库事务与TransactionScope代码事务区别

    1.TransactionScope代码事务 TransactionScope 类 位于using System.Transactions;命名空间下,需要在引用中手动加入.该类不能被继承. //// ...

最新文章

  1. R语言:计算各种距离
  2. python输出大小不同的字体_python – 为什么我的truetype字体大小为11渲染与windows不同?...
  3. 从docker 中抓取jvm heap 信息, 并且分析
  4. 10000以内回文数java,求10到10000有哪些回文数?用C语言编写  并且用数组
  5. boost::mp11::mp_starts_with相关用法的测试程序
  6. 前端学习(2738):重读vue电商网站48之通过 chainWebpack 自定义打包入口
  7. 位枚举(Bit Flags)
  8. 编程语言对比 引用数据类型-列表
  9. python源文件后缀_Python怎样获取文件扩展名
  10. 贝叶斯公式的直观理解(先验概率/后验概率)(未完)
  11. go - reflect
  12. Node.js 教程第十四篇——Socket.io
  13. 程序员所需要的数学知识都这里了
  14. Android hardware简易流程
  15. MySQL实战宝典 高可用架构篇 17 高可用设计三大高可用设计架构方案
  16. 山东省高中学业水平考试计算机考试教材,2017年山东高中学业水平考试科目
  17. 把色*版 “微信” 的底裤都给挖出来了,网友: 草率了。。。
  18. java计算机毕业设计科院垃圾分类系统源码+数据库+系统+lw文档+mybatis+运行部署
  19. 少儿编程网站源码和scratch课程
  20. Python实现各种加密,接口加解密不说难

热门文章

  1. LC-1732. 找到最高海拔
  2. “中国IT就业训练营”正式启动 首次校园公开课成功举办
  3. java 统计图 mysql_Mysql统计每年每个月的数据(前端页面统计图实现)
  4. java数组和链表6_java的数组和链表从熟系到陌生
  5. 桌面计算机休眠快捷键,win10系统桌面休眠快捷键设置的具体技巧
  6. 【目录】办公技能集合
  7. 安装jdk过程中报错1335缺少cda文件
  8. 亿级App陌陌发力移动直播 率先拥抱视频社交
  9. android省电模式 原理,Android省电模式侦听器?
  10. Hadoop架构模型