Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann man durch Deadlock verursachte SqlException abfangen?

Der Microsoft SQL Server-spezifische Fehlercode für einen Deadlock ist 1205, also müssten Sie die SqlException behandeln und danach suchen. Also z.B. Wenn Sie für alle anderen Arten von SqlException die Bubble-Ausnahme oben haben möchten:

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

Oder verwenden Sie die in C# 6 verfügbare Ausnahmefilterung

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

Um den tatsächlichen SQL-Fehlercode für eine bestimmte Nachricht zu finden, ist es praktisch, in sys.messages in SQL Server nachzusehen.

zB

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

Eine alternative Möglichkeit, Deadlocks (ab SQL Server 2005 und höher) zu handhaben, besteht darin, dies innerhalb einer gespeicherten Prozedur mit der TRY...CATCH-Unterstützung zu tun:

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

Ein vollständiges Beispiel finden Sie hier in MSDN, wie Deadlock-Wiederholungslogik rein innerhalb von SQL implementiert wird.