Подтвердить что ты не робот

Может ли серверные запросы sql быть действительно отменены/убиты?

Я хотел бы дать пользователю возможность отменить выполняемый запрос. Запрос выполняется очень медленно. (Оптимизация запросов - помимо этого.) Это в основном из моего любопытства.

MSDN говорит:

Если ничего не отменяется, ничего не происходит. Однако, если есть команда в процессе, и попытка отмены не выполняется, исключение не является генерируется.

  • Cmd - SqlCommand
  • DA - DataAdapter
  • Conn - SqlConnection
  • CurrentSearch - Тема
  • LongQuery - Singleton

Вот что у меня есть:

var t = new Thread(AbortThread);
t.Start();

void AbortThread()
{
    LongQuery.Current.Cmd.Cancel();
    LongQuery.Current.Cmd.Dispose();
    LongQuery.Current.DA.Dispose();
    LongQuery.Current.Conn.Close();
    LongQuery.Current.Conn.Dispose();
    LongQuery.Current.Cmd = null;
    LongQuery.Current.DA = null;
    LongQuery.Current.Conn = null;
    CurrentSearch.Abort();
    CurrentSearch.Join();
    CurrentSearch = null;
}

Я заметил, что CurrentSearch.Abort() блокирует, поэтому я завернул его в поток, что, вероятно, означает, что поток все еще работает.

Наконец, есть ли что-то еще, что я могу сделать, чтобы отменить запрос? Действительно ли можно отменить такой длинный запрос из .NET?

4b9b3361

Ответ 1

ЕСЛИ вы действительно абсолютно хотите убить его для хорошего использования этого подхода:

  • сохраните идентификатор сеанса перед запуском долгосрочного запроса, вызвав SELECT @@SPID AS 'SESSIONID' в том же соединении

Если вы хотите его убить:

  • Откройте новое соединение с БД
  • выпустить команду KILL для этого идентификатора сеанса
    ОСТОРОЖНО, поскольку в документации MSDN указано, что для этого требуется разрешение ALTER ANY CONNECTION

Ответ 2

Да, вы можете убить процесс из .NET. Вот пример. Обратите внимание, что вам понадобятся соответствующие разрешения, и вам нужно выяснить этот процесс. У меня нет быстрого выбора того, в каком процессе выполняется ваш запрос.

Вы, например, прерываете поток, но это не значит, что работа над SQL Server была прекращена. Если вы думаете об этом так: когда вы проходите через зону плохой клетки, и звонок падает, если вы мама/жена/друг гуляете, они немедленно прекращают говорить? Это аналогия прерывания потока, по крайней мере, в случае работы с сервером базы данных.