Может ли серверные запросы 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?
Ответы
Ответ 1
ЕСЛИ вы действительно абсолютно хотите убить его для хорошего использования этого подхода:
Если вы хотите его убить:
- Откройте новое соединение с БД
- выпустить команду
KILL
для этого идентификатора сеанса
ОСТОРОЖНО, поскольку в документации MSDN указано, что для этого требуется разрешение ALTER ANY CONNECTION
Ответ 2
Да, вы можете убить процесс из .NET. Вот пример. Обратите внимание, что вам понадобятся соответствующие разрешения, и вам нужно выяснить этот процесс. У меня нет быстрого выбора того, в каком процессе выполняется ваш запрос.
Вы, например, прерываете поток, но это не значит, что работа над SQL Server была прекращена. Если вы думаете об этом так: когда вы проходите через зону плохой клетки, и звонок падает, если вы мама/жена/друг гуляете, они немедленно прекращают говорить? Это аналогия прерывания потока, по крайней мере, в случае работы с сервером базы данных.