Как определить время ожидания сервера sql из приложения .NET без использования catch Exception - PullRequest
8 голосов
/ 27 апреля 2010

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

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

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

Ответы [ 2 ]

23 голосов
/ 27 апреля 2010

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

Стандартный способ - использовать 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 не добавлены для компактности

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

0 голосов
/ 27 апреля 2010

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

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

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

...