sql >> Databasteknik >  >> RDS >> Sqlserver

Hur fångar jag upp SqlException orsakad av dödläge?

Den Microsft SQL Server-specifika felkoden för ett dödläge är 1205 så du måste hantera SqlException och kontrollera det. Så, t.ex. om du för alla andra typer av SqlException vill ha bubblan uppåt:

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

Eller genom att använda undantagsfiltrering som är tillgänglig i C# 6

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

En praktisk sak att göra för att hitta den faktiska SQL-felkoden för ett givet meddelande är att leta i sys.messages i SQL Server.

t.ex.

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

Ett alternativt sätt att hantera dödlägen (från SQL Server 2005 och högre), är att göra det inom en lagrad procedur med hjälp av TRY...CATCH-stödet:

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

Det finns ett fullständigt exempel här i MSDN om hur man implementerar logik för återförsök med dödläge rent inom SQL.



  1. SQL Server:fascinerad av GETDATE()

  2. Gå med i samma tillfälliga bord i MySQL

  3. Använder Geekbench 3 för att utvärdera databasserverprestanda

  4. MySQL sök json värde med nyckel i array