TransactionScope maximumTimeout

Я использую TransactionScope в этом коде:

private void ExecuteSP()
{
    bool IsComplete = false;
    SqlCommand sqlComm = null;
    //6 hours!!!
    TimeSpan ts1 = new TimeSpan(6, 0, 0);
    try
    {
        using (TransactionScope t = new TransactionScope(TransactionScopeOption.RequiresNew, ts1))
        {
            using (SqlConnection sqlConn = new SqlConnection(GetConnectionString()))
            {
                //open sql connection
                sqlConn.Open();
                try
                {
                    //create new sqlCommand
                    sqlComm = new SqlCommand();
                    for (int i = 1; i <= 2; i++)
                    {
                        IsComplete = true;
                        //This command takes 15 minutes
                        sqlComm.CommandText = "exec TestSp";
                        sqlComm.Connection = sqlConn;
                        sqlComm.CommandType = CommandType.Text;
                        sqlComm.CommandTimeout = 18000;
                        //Executing my command
                        int j = sqlComm.ExecuteNonQuery();                       
                    }
                    //End
                    t.Complete();
                }
                catch (Exception ex)
                {
                    IsComplete = false;
                    string Message = ex.Message;
                }
                finally
                {
                    if (sqlComm != null)
                        sqlComm.Dispose();                 
                }
            }
        }
    }
    catch (Exception ex)
    {
        string messagee = ex.Message;
        //do something
    }
    finally
    {
        MessageBox.Show("Finsh");
    }
}

Это происходит после одного выполнения (sqlCommand.ExecuteNonQuery ();), выполнение которого занимает более 10 минут. Я не получаю никаких исключений в этом пункте, поскольку в следующем исключении я получаю следующее исключение:

The transaction associated with the current connection has completed but has not been disposed. The transaction must be disposed before the connection can be used to execute SQL statements.

Это потому, что для System.Transactions.TransactionManager.MaximumTimeout установлено значение TimeSpan равное 10 минутам.

Я ищу, и я был обнаружил, что, возможно, это связано с «maxTimeout System.Transactions -> machine.config», но после изменения конфигурации в этот файл я получаю исключение:

<?xml version="1.0"?>
<configuration> 
  <system.transactions>
    <machineSettings maxTimeout="10:00:00"/>
  </system.transactions> 
  <appSettings>    
    <add key="FileName" value="MyFileName" />
    <add key="MySpace" value="5 MB" />       
    <add key="ClientSettingsProvider.ServiceUri" value="" />        
  </appSettings>      
</configuration>

, когда я пытаюсь получить System.Транзакции.TransactionManager.MaximumTimeout во время выполнения после того, как я изменил файл конфигурации, я получаю следующее исключение:

«Системе конфигурации не удалось инициализировать»

Кто-нибудь знает, как решить эту проблему?

(Общее примечание о мое дело: Мне нужно выполнить хранимую процедуру, которая занимает около 20 минут, потому что мне нужно преобразовать таблицу, содержащую int, в bigint в SQL (int = 32bit, bigint = 64 bit). Мне нужно создать новые таблицы и вставить данные из старой таблицы в новую таблицу с помощью int64. Таблица связана по идентификатору с другими 4 таблицами, каждая из которых содержит более 20 миллионов строк, а также привязку, индексацию и многое другое. Я не могу разделить эту процедуру на небольшую хранимую процедуру, поэтому мне нужно изменить максимальный тайм-аут на один час или более, 10 минут недостаточно!).

15
задан abatishchev 3 May 2016 в 00:40
поделиться