当使用 ODBC 从客户端调用 SQL Server 时,如果运行长时间运行的查询导致超出SQL_ATTR_QUERY_TIMEOUT中指定的时间,我会看到控制权返回给应用程序。我的问题是 SQL Server 引擎中的工作是否继续。如果它确实继续,可以做些什么来中止/取消/停止服务器上的请求?是否有需要牢记的最佳实践注意事项?
问问题
655 次
1 回答
2
客户端向服务器发送一个注意信号:
客户端可以通过发送 Attention 消息来中断和取消当前请求。这也称为带外数据,但当前正在发送的任何 TDS 数据包必须在发送注意消息之前完成。在客户端发送一个注意消息后,客户端必须读取直到它收到一个注意确认。
引擎将在第一时间中止批处理(出于所有实际原因,立即)并发送回Attention ack。在某些状态下,批次不能被中断,例如。在回滚事务时。在这种情况下,客户端可能会请求中止,但只有在服务器终止不可中断的工作后才会有响应。
以上对于任何 SQL Server 客户端堆栈都是正确的,例如。完全相同的SqlCommand.CommandTimeout
工作方式。
该KILL
命令以非常相似的方式工作,只是不是客户端-服务器通信,而是 kill-SPID -> 受害者-SPID 通信。
于 2012-12-14T19:13:44.953 回答