как определить тайм-аут сервера sql из приложения .NET без использования исключения catch

В моем текущем приложении я выполняю обновление, вызывая команду T-SQL Update. Проблема в том, что в это время одна и та же запись заблокирована другими пользователями.

В приложении .NET приложение будет ждать истечения времени ожидания SQL Server, а затем выдаст время ожидания SqlException.

Можно ли сначала проверить, заблокирована ли конкретная запись другим процессом, а не перехватывать исключение?


person hadi teo    schedule 27.04.2010    source источник


Ответы (2)


Нет, не совсем.

Стандартный способ — использовать try/catch и обработать SqlException номер 1205 (жертва взаимоблокировки) и повторить запрос:

    try
    {
        // do stuff...
    }
    catch (SqlException sqlEx)
    {
        switch (sqlEx.Number)
        {
            case -2:   // Client Timeout
            case 701:  // Out of Memory
            case 1204: // Lock Issue 

            case 1205: // >>> Deadlock Victim
                // handle deadlock
                break;

            case 1222: // Lock Request Timeout
            case 2627: // Primary Key Violation
            case 8645: // Timeout waiting for memory resource 
            case 8651: // Low memory condition 
            ...
        }
    }

[Примечание: операторы break не добавлены для компактности

Также обратите внимание, что многие проблемы с блокировкой можно устранить, предоставив соответствующие покрывающие индексы.

person Mitch Wheat    schedule 27.04.2010

Вы можете использовать отдельное соединение с очень коротким временем ожидания, чтобы попытаться заблокировать запись, обновив какое-либо поле, но это все равно не даст вам 100% надежности.

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

Кроме того, убедитесь, что вы вообще не разрешаете пользователям блокировать записи — используйте автономный режим для любых обновлений. Другими словами, блокировка будет происходить только в течение короткого времени обновления (‹100 мс).

person IMHO    schedule 27.04.2010