sql >> Databáze >  >> RDS >> Sqlserver

Jak zachytit SqlException způsobenou uváznutím?

Kód chyby specifické pro Microsft SQL Server pro zablokování je 1205, takže budete muset zpracovat SqlException a zkontrolovat to. Takže např. pokud pro všechny ostatní typy SqlException chcete bublinu o výjimku nahoru:

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

Nebo pomocí filtrování výjimek dostupného v C# 6

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

Užitečná věc, kterou můžete udělat, abyste našli skutečný kód chyby SQL pro danou zprávu, je podívat se na sys.messages na serveru SQL Server.

např.

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

Alternativní způsob, jak zvládnout zablokování (od SQL Server 2005 a vyšší), je provést to v rámci uložené procedury pomocí podpory 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

Úplný příklad je zde v MSDN o tom, jak implementovat logiku opakování uváznutí čistě v rámci SQL.



  1. Začínáme s Oracle LiveSQL

  2. Datový model dodávky potravin

  3. Získání všech výsledků pomocí klauzule where

  4. Mysql smaže všechny příspěvky, které mají daný meta_key