【问题标题】:Can sql server queries be really cancelled/killed?sql server 查询真的可以取消/杀死吗?
【发布时间】:2011-10-20 14:47:46
【问题描述】:

我想让用户能够取消正在运行的查询。查询真的很慢。 (查询优化不是重点。)这主要是出于我的好奇心。

MSDN 说:

如果没有要取消的内容,则不会发生任何事情。但是,如果有一个 命令正在处理中,并且尝试取消失败,没有例外 生成。

  • Cmd - SqlCommand
  • DA - 数据适配器
  • Conn - SqlConnection
  • CurrentSearch - 线程
  • Lo​​ngQuery - 单例

这是我所拥有的:

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 取消如此长的查询?

【问题讨论】:

  • 查询是写数据,还是读数据?
  • @BrianKnight 只是从多个视图中阅读。

标签: c# sql-server


【解决方案1】:

如果您真的绝对想杀死它以充分利用这种方法:

当你想杀死它时:

  • 打开一个新的数据库连接
  • 为该会话 ID 发出 KILL 命令
    请注意,因为 MSDN 文档指出您需要权限 ALTER ANY CONNECTION 才能执行此操作

【讨论】:

  • KILL 命令需要提升权限 - ALTER ANY CONNECTION。
  • 太棒了!做到了。谢谢Yahia!
  • 我们可以在这里使用transaction.rollback()吗?
  • @m.qayyum 你是什么意思?要中止的查询是长时间运行的...... KILL 将回滚任何在这方面挂起的事务(甚至是分布式事务)......并且您建议的 AFAIK 仅适用于正在运行事务但该连接繁忙的连接所以我很确定这只会阻止或抛出异常,但本质上对停止长时间运行的查询没有任何作用......
【解决方案2】:

是的,您可以从 .NET 中终止进程。 Here is an example。请注意,您将需要适当的权限,并且您必须弄清楚有问题的过程。我没有确定您的查询在哪个进程下运行的快速示例。

您的示例中止了线程,但这并不意味着 SQL Server 上的工作已终止。如果你这样想:当你经过一个坏的小区并且电话掉线时,如果你的妈妈/妻子/朋友在嗡嗡作响,他们会立即停止说话吗?这类似于中止线程,至少在使用数据库服务器的情况下。

【讨论】:

  • 他试图杀死一个正在进行的查询,而不是一个进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2012-09-07
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多