sql >> Database >  >> RDS >> Sqlserver

Hoe SqlException te vangen die wordt veroorzaakt door een impasse?

De Microsoft SQL Server-specifieke foutcode voor een deadlock is 1205, dus u moet de SqlException afhandelen en daarop controleren. Dus bijv. als je voor alle andere typen SqlException wilt dat de bubbel de uitzondering omhoog gaat:

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

Of, met behulp van uitzonderingsfiltering beschikbaar in C# 6

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

Een handig ding om te doen om de daadwerkelijke SQL-foutcode voor een bepaald bericht te vinden, is door te kijken in sys.messages in SQL Server.

bijv.

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

Een alternatieve manier om met deadlocks om te gaan (vanaf SQL Server 2005 en hoger), is om dit te doen binnen een opgeslagen procedure met behulp van de TRY...CATCH-ondersteuning:

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

Er is een volledig voorbeeld hier in MSDN voor het implementeren van logica voor opnieuw proberen van deadlocks, puur binnen SQL.



  1. Hoe mysql-query te vertalen om orm te vervolgen?

  2. Retourdatum kreeg geen uur en minuten terug

  3. Volgorde in Oracle/PostgreSQL zonder ID in insert-instructie

  4. Een opzoekbesturingselement toevoegen aan een formulier in Access 2016