TransactionScope 类

  1、使代码块成为事务性代码,此类不能被继承。

  2、继承层次结构

        System.Object
          System.Transactions.TransactionScope

  3、备注

      在System.Transactions多事务自动管理的基础平台上,System.Transactions 提供了基于Transaction类显式编程模型,

    以及使用TransactionScope类隐式编程模型。

    重要事项

      建议创建隐式事务使用TransactionScope类,使系统自动为您管理事务。当有需要跨多个函数调用或多个线程对同一事务

         的使用要求,你也可以使用TransactionScope和DependentTransaction类。

      在实例化TransactionScope由的声明中,事务管理器来确定Transaction的范围。一旦确定了Transaction(事务)范围,

    Transaction(事务)范围就一直属于那个事务。Transaction(事务)范围的确定基于两个因素:Transaction(事务)构造函数中的

    transactionscopeoption参数的值;环境事务中的事务代码块。

  如果没有异常发生在事务(即TransactionScope对象的初始化及其处理方法)调用之中,那么在事务范围内代码块会顺利执行完成。

    如果一个事务范围中发生了异常,它所参与的事务将会回滚。

      当使用事务时,需要调用事务函数Complete。 

  4、示例

    

// This function takes arguments for 2 connection strings and commands to create a transaction // involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the // transaction is rolled back. To test this code, you can connect to two different databases // on the same server by altering the connection string, or to another 3rd party RDBMS by // altering the code in the connection2 code block.
static public int CreateTransactionScope(
    string connectString1, string connectString2,
    string commandText1, string commandText2)
{
    // Initialize the return value to zero and create a StringWriter to display results.
    int returnValue = 0;
    System.IO.StringWriter writer = new System.IO.StringWriter();

    try
    {
        // Create the TransactionScope to execute the commands, guaranteeing
        // that both commands can commit or roll back as a single unit of work.
        using (TransactionScope scope = new TransactionScope())
        {
            using (SqlConnection connection1 = new SqlConnection(connectString1))
            {
                // Opening the connection automatically enlists it in the
                // TransactionScope as a lightweight transaction.
                connection1.Open();

                // Create the SqlCommand object and execute the first command.
                SqlCommand command1 = new SqlCommand(commandText1, connection1);
                returnValue = command1.ExecuteNonQuery();
                writer.WriteLine("Rows to be affected by command1: {0}", returnValue);

                // If you get here, this means that command1 succeeded. By nesting
                // the using block for connection2 inside that of connection1, you
                // conserve server and network resources as connection2 is opened
                // only when there is a chance that the transaction can commit.
                using (SqlConnection connection2 = new SqlConnection(connectString2))
                {
                    // The transaction is escalated to a full distributed
                    // transaction when connection2 is opened.
                    connection2.Open();

                    // Execute the second command in the second database.
                    returnValue = 0;
                    SqlCommand command2 = new SqlCommand(commandText2, connection2);
                    returnValue = command2.ExecuteNonQuery();
                    writer.WriteLine("Rows to be affected by command2: {0}", returnValue);
                }
            }

            // The Complete method commits the transaction. If an exception has been thrown,
            // Complete is not  called and the transaction is rolled back.
            scope.Complete();

        }

    }
    catch (TransactionAbortedException ex)
    {
        writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
    }
    catch (ApplicationException ex)
    {
        writer.WriteLine("ApplicationException Message: {0}", ex.Message);
    }

    // Display messages.
    Console.WriteLine(writer.ToString());

    return returnValue;
}

  5、声明

    本文来自MSDN的备注部分没有中文文档,所以自己就简单翻译了一下。如有错误请指教。

    

-->

时间: 2024-10-13 11:53:29

TransactionScope 类的相关文章

TransactionScope类的使用

如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项:1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具体示例如下:   /// <summary>        /// 发送消息         /// </summary>        /// <param name="sendUserId"></param>        /// <

基于TransactionScope类的分布式隐式事务

System.Transactions 命名空间中除了上一节中提到的基于 Transaction 类的显式编程模型,还提供使用 TransactionScope 类的隐式编程模型,它与显示编程模型相比,更加方便简单,它也是MSDN中建议使用的编程模型. 下面,我们基于TransactionScope类实现上一节银行转帐的例程. 示例代码: (1)SqlHelper.cs using System; using System.Collections.Generic; using System.Li

C#语言中TransactionScope类的使用(转)

如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项: 1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具体示例如下:         /**//// <summary>         /// 发送消息          /// </summary>         /// <param name="sendUserId"></param>  

TransactionScope类

命名空间:System.Transactons MSDN解释:使代码块成为事务性代码,此类不能被继承. 百度空间:在项目中引用using System.Transaction命名空间.在using 中定义了一个TransactionScope,相当于定义了一个事物范围即,这个事务作用域为using内.在using 作用域内,如果没有scope.Complete()命令,那么scope在销毁时,会自动回滚所有的操作. msdn代码示例 try{ using(Transaction scope=ne

C#中TransactionScope的使用方法和原理

在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的.这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入. 在.net 2.0后,TransactionScope类的出现,大大的简化了事务的设计.示例代码如下: static void Main(string[] args) { usi

C#分布式事务解决方案-TransactionScope

引用一下别人的导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我们所希望的是能够在整个这个方法定义为一个事务,TransactionScope 类提供一个简单方法,通过这一方法,您不必与事务本身交互,即可将代码块标记为参与某个事务.TransactionScope对象创建了一个事务,同时将该事务设置给Transaction类的Current属性. 一.TransactionScope的优点 1.使用起来比较方便.Transa

关于TransactionScope 使用

在去年的项目中使用了TransactionScope,现在总结下TransactionScope的使用说明 一.TransactionScope是.Net Framework 2.0之后,新增了一个名称空间.它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物.使用之前必须添加对 System.Transactions.dll 的引用. 二.代码实例 //设置事务隔离级别transactionOption.IsolationLevel = System.Tra

转:C#中TransactionScope的使用方法和原理

在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的.这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入. 在.net 2.0后,TransactionScope类的出现,大大的简化了事务的设计.示例代码如下: static void Main(string[] args) { usi

【网摘】C#中TransactionScope的使用方法和原理

时间 2013-08-12 19:59:34  51CTO推荐博文 原文  http://cnn237111.blog.51cto.com/2359144/1271600 在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的.这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入. 在.n