Załóżmy, że używam C# do uruchomienia długo działającej procedury składowanej SQL Server (powiedzmy 30 minut). Dalej przypuśćmy, że umieszczam 1-godzinny okres czasu na kwerendzie w C# taki, że jeśli z jakiegokolwiek powodu ten SP trwa dłużej niż oczekiwano, nie kończę na mononizacji DB. Na koniec załóżmy, że ta procedura przechowywana ma blok try/catch, który przechwytuje błędy i wykonuje pewne czyszczenie w przypadku niepowodzenia jakichkolwiek kroków.Co robi program SQL Server z przekroczonym limitem czasu?
Niektóre kodu (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 (w zasadzie sprowadza się do poniższych):
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
Moje pytanie brzmi, co będzie SQL Server zrobić z kwerendy, gdy polecenie przekracza limit czasu ze strony C#? Czy wywoła blok catch w SP, czy też po prostu odetnie go tak, że będę musiał przeprowadzić czyszczenie w kodzie C#?
Polecenie nie zostanie zakończony od strony C# - baza danych będzie czas ją. Kod C# nie ma nad tym kontroli (powiedział DB do limitu czasu po 1 godzinie, a DB właśnie to robi). – Oded