Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak złapać SqlException spowodowany przez zakleszczenie?

Kod błędu specyficzny dla Microsoft SQL Server dla zakleszczenia to 1205, więc musisz obsłużyć SqlException i to sprawdzić. Tak więc m.in. jeśli dla wszystkich innych typów SqlException chcesz, aby wyjątek był wyświetlany w górę:

catch (SqlException ex)
{
    if (ex.Number == 1205)
    {
        // Deadlock 
    }
    else
        throw;
}

Lub używając filtrowania wyjątków dostępnego w C# 6

catch (SqlException ex) when (ex.Number == 1205)
{
    // Deadlock 
}

Przydatną rzeczą do zrobienia, aby znaleźć rzeczywisty kod błędu SQL dla danej wiadomości, jest zajrzenie do sys.messages w SQL Server.

np.

SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033

Alternatywnym sposobem obsługi zakleszczeń (od SQL Server 2005 i nowszych) jest wykonanie tego w ramach procedury składowanej przy użyciu obsługi TRY...CATCH:

BEGIN TRY
    -- some sql statements
END TRY
BEGIN CATCH
    IF (ERROR_NUMBER() = 1205)
        -- is a deadlock
    ELSE
        -- is not a deadlock
END CATCH

Pełny przykład znajduje się tu w MSDN o tym, jak zaimplementować logikę ponawiania zakleszczeń wyłącznie w SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd przywracania bazy danych programu SQL Server:określony rzut jest nieprawidłowy. (UIMenedżera Sql)

  2. Znajdź i usuń powtarzające się podciągi

  3. Jak podstawić ciąg, jeśli rekord ma wartość NULL w T-SQL?

  4. Podziel ciąg znaków przecinkiem w SQL Server 2008

  5. Czy Z WYJĄTKIEM wykonuje się szybciej niż JOIN, gdy kolumny tabeli są takie same?