2009-11-11 19 views
6

Si ejecuto un proceso almacenado utilizando el SqlCommand y el SqlCommand supera el tiempo de espera, ¿el StoredProc continúa ejecutándose o se fuerza al salir cuando el SqlCommand se desconecta?Stored Proc y SqlCommand Timeout

Respuesta

3

Mi instinto me decía que el procedimiento seguiría ejecutándose, así que armé una prueba simple.

SQL:

Create Procedure TestDelay 
AS 

waitfor delay '00:00:40' 

update table_1 
set dt = getdate() 

Y en VB.Net (igual que C# para este propósito):

Dim con As New SqlConnection(myconnectionstring) 
    Dim com As New SqlCommand("TestDelay", con) 
    com.CommandType = CommandType.StoredProcedure 
    con.Open() 
    Try 
     com.ExecuteNonQuery() 
    Catch ex As Exception 
     con.Close() 
     Response.Write(ex.Message) 
    End Try 

El resultado? El procedimiento no se completó después del tiempo de espera. Comprobé qué estaba sucediendo durante un rastreo en el generador de perfiles de SQL y, efectivamente, aparece SQL para envolver la llamada en una transacción y debe retrotraer esa transacción en el tiempo de espera.

Nota: Esta prueba se ejecutó contra SQL 2005, pero sospecho que los resultados serán similares en otras versiones.

+0

correcta, al menos volver a SQL 7 – gbn

1

Como afirmó Brendan, el cliente envía un "aborto" y el procesamiento se detiene. Tan sencillo como eso.

Sin embargo, es más complejo que eso ...

Cualquier transacción no se revierten de forma predeterminada y bloqueos se acaba de dejar allí hasta que se cierre la conexión. Si se devuelve al grupo de conexiones y se reutiliza, este no cuenta como como cierre.

Esta es la razón por SET XACT_ABORT ON (SO1 otras preguntas, SO2) se recomienda

Cuestiones relacionadas