——本篇文章主要是对C#中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;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事务需要开启一些服务,(如果数据库不在本地,服务器和客户端都需要开启以下服务和组件服务)

以下组件服务需要开启

step1

step2:

C#中TransactionScope的使用小结相关推荐

  1. Java中getResourceAsStream的用法小结

    2019独角兽企业重金招聘Python工程师标准>>> Java中getResourceAsStream的用法小结 一.Java中的getResourceAsStream主要有以下三 ...

  2. PHP中的语法特点小结

    PHP中的语法特点小结 1.PHP的变量开头要加上$符号,见到$就知道这个是一个变量 2.PHP中的常量才是不用加$符号的 3.PHP中$可以用来嵌套使用,从而实现动态的变量名的层级调用 4.PHP程 ...

  3. JS中自动执行函数小结

    JS中自动执行函数小结 请看以下两个函数: 1.function a(){ 2.    alert("a") 3.} 1.var b= function(){ 2.    aler ...

  4. python static 的用法_Python中static相关知识小结

    非 static 编译 不指定额外参数直接编译 Python: $ ./configure $ make 查看所依赖的共享库: $ ldd python linux-vdso.so.1 => ( ...

  5. 纪中DAY15做题小结

    纪中DAY15做题小结 T1:淘汰赛制 T2:方程的解 T3:物流运输 T4:矩阵乘法(mat) T1:淘汰赛制 Description 淘汰赛制是一种极其残酷的比赛制度.2 ^ n名选手分别标号1, ...

  6. 纪中DAY5做题小结

    纪中DAY5做题小结 T1:直角三角形 T2:排序 T3:自行车赛 T4:小L的数列 T1:直角三角形 Description 二维平面坐标系中有N个点. 从N个点选择3个点,问有多少选法使得这3个点 ...

  7. 纪中DAY8做题小结

    纪中DAY8做题小结 T1:少女觉 T2:灵知的太阳信仰 T3:多段线性函数 T4:DY引擎 T1:少女觉 Description 在幽暗的地灵殿中,居住着一位少女,名为古明地觉. 据说,从来没有人敢 ...

  8. 英语写作中常见的“转折”小结

    英语写作中常见的"转折"小结 (1)一般意义上的"转折":but, yet, however,nevertheless(nonetheless), though ...

  9. PHP中可执行代码小结

    PHP中可执行代码小结 PHP中可以执行代码的函数,常用于编写一句话木马,可能导致代码执行漏洞,这里对代码执行函数做一些归纳. 常见代码执行函数,如 eval().assert().preg_repl ...

最新文章

  1. 企业怎样管理员工才会更有效?
  2. 11款新品,一切为了落地!商汤:普惠AI的时代,来了
  3. Android改变移动网络ip地址,Android之获取移动网络ip
  4. Wait--查看等待
  5. Java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)
  6. zookeeper for mac安装
  7. Linux 命令之 declare -- 声明或显示 shell 变量
  8. 5000并发的qps是多少_高并发架构设计
  9. 生活大爆炸系列之制作望远镜架
  10. 视频教程 | 3D 跑酷小游戏实战开发(上)
  11. c语言 格式化硬盘,在Windows 7上用c ++格式化硬盘(Formatting a hard disk in c++ on Windows 7)...
  12. 一人顶一个团队的华为天才少年稚晖君,又带来一项硬核黑科技,引起极客圈地震!...
  13. 3Dmax自动加载脚本错误,语法错误:位于bad,需要因子
  14. 手把手教你搭建属于自己的技术博客
  15. android 投屏与反控,大屏也能反控手机了,type-c接口的无线投屏器带来的改变
  16. 分享苹果电脑和乔布斯的十项成功秘诀
  17. 2014年360广告算法面试经历
  18. 工具使用分享之爱思助手安装苹果APP
  19. 海思hi3516dv300 配置uart3
  20. 记一个eclipse快捷键Alt+Shift+L

热门文章

  1. 处nm是什么意思_“nm”是什么意思啊?
  2. css位置-moz-兼容,兼容不同浏览器的CSS前缀-webkit-,-ms-,-moz-,-o-
  3. 【plang 1.4.6】Plang高级编程语言(发布)
  4. python读取歌词文本,并显示在图片上,制作视频
  5. 360极速浏览器屏蔽百度广告
  6. Cortex-M3 Bit-Banding
  7. HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
  8. Java向数据库中插入数据出错时怎么避免插入错误数据
  9. Kubernetes资源平台--ratel
  10. 服务器上开虚拟机,可以在云服务器上开虚拟机