как обрабатывать ASP. NET dbtransaction timeout - PullRequest
0 голосов
/ 13 февраля 2020

В течение нескольких дней в приложении ASP. NET 2.0 & SQL Server 2008 наблюдаются тайм-ауты транзакций в БД.

Проблема связана с использованием SQL трассировки профилировщика сервера для "функция, вызывающая веб-сервис".

У нас есть транзакция, включающая несколько хранимых процедур (sp). Но у хранимой процедуры № 3 есть несколько байтов для сохранения в БД, она требует времени. Если время превышает 25 секунд, выдается сообщение об исключении тайм-аута:

Сообщение: System.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос. ---> System.Data.SqlClient.SqlException: истекло время ожидания. Период ожидания истек до завершения операции, или сервер не отвечает.

в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое прерывание связи)
в System.Data.SqlClient. TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj)

Мой код:

using (System.Data.Common.DbConnection connection = o_DB.CreateConnection())
{
     connection.Open();

     System.Data.Common.DbTransaction o_Transaction = connection.BeginTransaction();

     try
     {
        - exec sp1
        - exec sp2
        foreach{
            - exec sp3
        }
     }

Мы пробовали некоторые решения в Интернете, но они не работали. Я надеюсь, что кто-то может помочь мне. Большое спасибо.

У нас нет timeout в строке подключения в web.config, он не страдает от исключения после 15 с (по умолчанию)

Устанавливаем время ожидания транзакции в web.config:

<system.transactions>
    <machineSettings maxTimeout="00:00:30" />
</system.transactions>

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Это вы также можете напрямую обрабатывать по коду. Пожалуйста, смотрите код ниже

public DataSet getData(string command)
{
    DataSet ds = new DataSet();
    string connectionString = ConfigurationManager.ConnectionStrings["TESTDB"].ConnectionString;
    using (var conn = new SqlConnection(connectionString))
    {
        using (var cmd = new SqlCommand(command, conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandTimeout = 0;
            SqlDataAdapter adapt = new SqlDataAdapter(cmd);
            conn.Open();
            adapt.Fill(ds);
            conn.Close();
        }
    }
    return ds;
}

Линия раздувания изменит время выполнения на бесконечность или до завершения выполнения запроса.

cmd.CommandTimeout = 0;
0 голосов
/ 13 февраля 2020

Что-то в этом роде

using (var ts = CreateTransactionScope(TimeSpan.FromSeconds(mySecondsVar)))
{ 
    using (System.Data.Common.DbConnection connection = o_DB.CreateConnection())
    {
        using (IDbTransaction tran = connection.BeginTransaction()) {
        try 
        {
            // your code
        }  
        catch {
            tran.Rollback();
        }
    }
}
    ts.Complete();
}

Если все в порядке, утилизация выполняет коммит автоматически.

...