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