TransactionScope

简介:
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>

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

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

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

   连接字符串关键字(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),并尽可能快地完成和释放事务。在事务执行期间,您还应该避免执行任何不必要的、与数据库无关的代码,这能够防止资源被毫无疑义地锁定过长的时间。


本文转自 netcorner 博客园博客,原文链接:   http://www.cnblogs.com/netcorner/archive/2010/11/10/2911986.html,如需转载请自行联系原作者


相关文章
|
12月前
|
芯片
如何根据设备文档和开发板标识来确定 GPIO 引脚的编号
要确定GPIO引脚编号,首先查阅设备的官方文档,了解引脚布局和功能。接着,查看开发板上的标识,如数字或字母标记,对照文档确认具体编号。此过程确保正确连接硬件,避免损坏设备。
|
12月前
|
Linux 文件存储 Windows
linux软连接详解!!!
本文介绍了Linux文件类型、文件属性、文件存储机制以及软链接和硬链接的概念。主要内容包括:Linux文件类型及其识别方法、文件属性的组成及查看方式、inode和block的作用、软链接和硬链接的区别及应用场景。通过具体示例,帮助读者理解Linux文件系统的运作原理。
679 2
linux软连接详解!!!
|
SQL 数据库连接 数据处理
批量提交SQL语句的技巧与方法
在数据库操作中,批量提交SQL语句可以显著提高数据处理的效率,特别是在需要执行大量插入、更新或删除操作时
|
SQL 消息中间件 分布式计算
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
374 0
|
JavaScript 前端开发 算法
写 React / Vue 项目时为什么要在列表组件中写 key
在React或Vue项目中,为列表组件中的每个元素添加唯一的key属性,有助于框架高效地更新和渲染列表。Key帮助虚拟DOM识别哪些项已更改、添加或删除,从而优化性能并减少不必要的重新渲染。
|
机器学习/深度学习 数据采集 PyTorch
高效数据加载与预处理:利用 DataLoader 优化训练流程
【8月更文第29天】 在深度学习中,数据加载和预处理是整个训练流程的重要组成部分。随着数据集规模的增长,数据加载的速度直接影响到模型训练的时间成本。为了提高数据加载效率并简化数据预处理流程,PyTorch 提供了一个名为 `DataLoader` 的工具类。本文将详细介绍如何使用 PyTorch 的 `DataLoader` 来优化数据加载和预处理步骤,并提供具体的代码示例。
2155 1
|
前端开发 Java API
阿里云百炼模型入门篇-大语言模型
本文主要介绍如何快速的通过阿里云百炼,带你如何快速入门通义千问系列大语言模型。
2471 6
|
存储 SQL 算法
leetcode题目68:文本左右对齐【python】
leetcode题目68:文本左右对齐【python】
|
JavaScript Java 测试技术
基于springboot+vue.js的精品在线试题库系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的精品在线试题库系统附带文章和源代码设计说明文档ppt
157 6