TransactionScope 类

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

 

  2、继承层次结构

 

        System.Object
          System.Transactions.TransactionScope

  3、备注

 

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

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

 

    重要事项

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

         的使用要求,你也可以使用TransactionScopeDependentTransaction类。

 

      在实例化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的备注部分没有中文文档,所以自己就简单翻译了一下。如有错误请指教。

 

 

 

 

    

posted @ 2015-04-19 20:39  荣码一生  阅读(163)  评论(0编辑  收藏  举报