如果在Using块的末尾未调用TransactionScope.Complete,事务将如何处理

时间:2018-08-27 05:10:19

标签: c# sql-server ado.net transactionscope

我正在使用SQL Server 2012,并且SFML使用块内有多个SQL连接到同一数据库。但是,如果第一次Update SQL Operation无法产生所需的输出,那么我将跳过对SQL Operation的下一次调用,同时也将省略对TransactionScope块末尾未调用的TransactionScope.Complete的调用。

2 个答案:

答案 0 :(得分:3)

您所需的大多数信息都在这里Completing a transaction scope

中列出。
  

当您的应用程序完成它要在其中完成的所有工作时,   交易,您应该只调用一次Complete方法来通知   交易经理认为可以接受   交易。最好将完成呼叫设为   using块中的最后一条语句。

     

无法调用此方法会中止交易,因为   事务管理器将此解释为系统故障或等效   在事务范围内引发的异常。然而,   调用此方法并不能保证交易会   承诺。这只是一种通知交易经理的方法   你的状态。调用Complete方法后,您将无法再   通过使用Current属性访问环境交易,并且   尝试这样做将导致引发异常。

答案 1 :(得分:2)

未能成功完成交易将导致交易中止,这就是呼叫transaction.complete();

非常好的经验的原因

将会发生的事情是,事务管理器会将其解释为系统故障并抛出异常(对我来说是一次,不好),但这是一个很大的 然而 ,它不能保证事务将被提交,因此您也必须调用commit。

例如:

       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();

        }

提交将在using块的末尾进行,也就是说,如果TransactionScope对象最初创建了作品。否则,将在每次调用commit时进行提交。