sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan fanger jeg SqlException forårsaget af dødvande?

Den Microsft SQL Server-specifikke fejlkode for en deadlock er 1205, så du skal håndtere SqlException og tjekke for det. Så f.eks. hvis du for alle andre typer SqlException vil have boblen undtagelsen op:

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

Eller ved at bruge undtagelsesfiltrering tilgængelig i C# 6

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

En praktisk ting at gøre for at finde den faktiske SQL-fejlkode for en given besked, er at kigge i sys.messages i SQL Server.

f.eks.

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

En alternativ måde at håndtere deadlocks (fra SQL Server 2005 og nyere) er at gøre det i en lagret procedure ved hjælp af TRY...CATCH-understøttelsen:

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

Der er et fuldstændigt eksempel her i MSDN af, hvordan man implementerer deadlock genforsøgslogik rent inden for SQL.



  1. MySql. Sådan bruger du Self Join

  2. Sådan fungerer INSTR() i MariaDB

  3. Ring til getNextException for at se årsagen:Sådan får du Hibernate/JPA til at vise DB-servermeddelelsen for en undtagelse

  4. Mysql-begivenhed virker ikke