0

ODBCを使用してクライアントからSQLServerを呼び出すときに、長時間実行されるクエリが実行され、SQL_ATTR_QUERY_TIMEOUTで指定された時間が超過すると、制御がアプリケーションに返されることがわかります。私の質問は、SQLServerエンジン内で作業を続行するかどうかです。それが続行する場合、サーバーでリクエストを中止/キャンセル/停止するために何ができるでしょうか?覚えておくべきベストプラクティスの考慮事項はありますか?

4

1 に答える 1

2

クライアントはサーバーに注意信号を送信します。

クライアントは、アテンションメッセージを送信することにより、現在の要求を中断およびキャンセルできます。これは帯域外データとも呼ばれますが、現在送信されているTDSパケットは、アテンションメッセージを送信する前に終了する必要があります。クライアントがアテンションメッセージを送信した後、クライアントはアテンション確認応答を受信するまで読み取る必要があります。

エンジンは最初の機会にバッチを中止し(すべての実用的な理由で、すぐに)、アテンションackを送り返します。特定の状態では、バッチを中断することはできません。トランザクションをロールバックしている間。このような場合、クライアントは中止を要求できますが、応答はサーバーが中断できない作業を終了した後にのみ返されます。

上記は、SQLServerクライアントスタックすべてに当てはまります。動作方法もまったく同じですSqlCommand.CommandTimeout

このKILLコマンドは、クライアント/サーバー通信ではなく、killing-SPID->victim-SPID通信であることを除いて非常によく似た方法で機能します。

于 2012-12-14T19:13:44.953 に答える