Предположим, что я использую С# для запуска длительной хранимой процедуры SQL Server (скажем, 30 минут). Предположим далее, что я задал 1-часовой период таймаута для запроса в С# таким образом, что если по какой-либо причине этот SP занимает больше времени, чем ожидалось, я не стану монополизировать БД. Наконец, предположим, что эта хранимая процедура имеет в ней блок try/catch, чтобы улавливать ошибки и выполнять некоторую очистку, если какие-либо шаги внутри нее терпят неудачу.
Некоторый код (С#):
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 (в основном, соответствует следующему):
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
Мой вопрос: что SQL Server сделает с запросом, когда команда выйдет со стороны С#? Будет ли он ссылаться на блок catch SP, или он просто полностью отключит его, так что мне нужно будет выполнить очистку кода С#?