sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo atrapar SqlException causada por interbloqueo?

El código de error específico de Microsft SQL Server para un interbloqueo es 1205, por lo que deberá controlar la SqlException y comprobarlo. Entonces, p. si para todos los demás tipos de SqlException desea que aparezca la excepción:

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

O bien, utilizando el filtrado de excepciones disponible en C# 6

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

Una cosa útil para encontrar el código de error de SQL real para un mensaje determinado es buscar en sys.messages en SQL Server.

por ejemplo

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

Una forma alternativa de manejar interbloqueos (desde SQL Server 2005 y superior) es hacerlo dentro de un procedimiento almacenado utilizando el soporte 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

Hay un ejemplo completo aquí en MSDN sobre cómo implementar la lógica de reintento de punto muerto puramente dentro de SQL.