Supponiamo di utilizzare C# per eseguire una stored procedure SQL Server di lunga durata (diciamo 30 minuti). Supponiamo inoltre di mettere un intervallo di timeout di 1 ora sulla query in C# in modo tale che se per qualsiasi ragione questo SP impieghi più tempo del previsto, non finirò per monopolizzare il DB. Supponiamo infine che questa procedura memorizzata contenga un blocco try/catch per rilevare gli errori e fare un po 'di pulizia nel caso in cui eventuali passaggi interni non riescano.Che cosa fa SQL Server con una richiesta scaduta?
Alcuni di codice (C#):
using (SqlCommand comm = new SqlCommand("longrunningstoredproc"))
{
comm.Connection = conn;
comm.CommandType = CommandType.StoredProcedure;
comm.CommandTimeout = 3600;
comm.ExecuteNonQuery();
}
/* Note: no transaction is used here, the transactions are inside the stored proc itself. */
T-SQL (in pratica equivale al seguente):
BEGIN TRY
-- initiailize by inserting some rows into a working table somewhere
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
BEGIN TRANS
-- do long running work
COMMIT TRANS
-- etc.
-- remove the rows from the working table (and set another data point to success)
END TRY
BEGIN CATCH
-- remove the rows from the working table (but don't set the other data point to success)
END CATCH
La mia domanda è, quale sarà SQL Server fare con la query quando il comando va fuori tempo dal lato C#? Richiama il blocco catch del SP, o lo interromperà del tutto in modo tale che avrei bisogno di eseguire il clean-up nel codice C#?
Il comando non verrà timeout dal sito # C - il database sarà tempo fuori. Il codice C# non ha alcun controllo su questo (ha detto al DB di scadere dopo 1 ora, e il DB fa proprio questo). – Oded