jak wykryć limit czasu serwera sql from.NET aplikacja bez użycia wyjątku catch

W mojej obecnej aplikacji wykonuję aktualizację, wywołując polecenie T-SQL Update. Problem polega na tym, że ten sam rekord jest zablokowany przez innych użytkowników w tym czasie.

W aplikacji. NET aplikacja będzie czekać do limitu czasu SQL Server, a następnie dorzuci limit czasu SqlException.

Czy można najpierw sprawdzić, czy dany rekord jest zablokowany przez inny proces, a nie wyłapać wyjątek ?

Author: Mitch Wheat, 2010-04-27

2 answers

Nie, Nie bardzo.

Standardowym sposobem jest użycie try/catch i obsłużenie SqlException numeru 1205 (ofiara deadlock) i ponów zapytanie:

    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 
            ...
        }
    }

[Uwaga: wyrażenia break nie są dodawane dla zwartości

Zauważ również , wiele problemów z blokowaniem można wyeliminować, zapewniając odpowiednie indeksy krycia.

 22
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 13:24:36

Możesz użyć osobnego połączenia z bardzo krótkim czasem, aby spróbować zablokować rekord poprzez aktualizację jakiegoś pola, ale to nadal nie da ci 100% niezawodności.

Jeśli naprawdę masz sytuację z wieloma użytkownikami edytującymi te same rekordy, powinieneś przyjrzeć się optymistycznym technikom blokowania.

Upewnij się również, że nie zezwalasz użytkownikom na blokowanie rekordów - użyj trybu rozłączonego dla wszelkich aktualizacji. Innymi słowy, blokowanie nastąpi tylko przez krótki czas update (

 0
Author: IMHO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 13:28:06