个人理解就是: 吧一些方法封装在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. 向量空间和计算机科学与技术,向量空间
  2. 岳西中自机器人_中国科学院
  3. C++ STL 遍历 map 的时候如何删除其中的 element
  4. 【转】C#命名空间与java包的区别分析
  5. 苹果id是什么格式的_iTunes Converter mac(音频格式转换工具)
  6. UnityShader3:ShaderLab
  7. c#服务器后台搭建_微信影视小程序搭建拆解:第一课,影视小程序简介,搭建影视小程序的整体流程...
  8. Android 端 Rsa加密数据
  9. 测试远程服务器udp端口,测试远程udp端口
  10. 《Web应用基础》课程结业报告
  11. Protractor小结
  12. 路由器连接路由器设置方法
  13. 朋友圈图片评论功能,来了!
  14. 计算机考证上传照片说明
  15. BZOJ 4239 巴士走读
  16. 【Protle99SE】PCB中各层的含义【小汇】
  17. FPGA经验谈系列文章——FPGA资源评估
  18. html中怎么制作选择头像,网页中的个人头像选择框(转)
  19. Android常用开源库整理汇总
  20. 使用pytorch完成kaggle猫狗图像识别

热门文章

  1. Android 超简单音乐播放器(六)播放暂停音乐,更换播放模式,上下歌曲切换(service)
  2. python爬取中国大学_Python 3爬取全国高校基本信息
  3. 基于QT制作的天气指数人机交互界面
  4. HTML5期末大作业:美妆网页设计——兰蔻商城6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  5. Autodesk CAD 2011
  6. allure简介与使用
  7. 如何使用压缩工具的自解压格式
  8. linux ldd命令的使用
  9. 算法工程师体验了一下chatGPT,已经上瘾了!
  10. columnmodel 动态cell编辑