web-dev-qa-db-ja.com

sp_reset_connectionは何をしますか?

sp_reset_connectionは、プールから再利用された接続の設定のほとんどがリセットされるようにするために、SQL Server接続プールによって呼び出されるようです。誰かがそれが何をしているかを正確に知っていますか?

この投稿 から、トランザクション分離レベルがリセットされないことがわかります

44
Rory

ODBC、OLE-DB、SqlClientなどのデータアクセスAPIのレイヤーは、接続プールからの接続を再利用するときに(内部)ストアドプロシージャsp_reset_connectionを呼び出します。これは、再利用される前に接続の状態をリセットするために行われます。

何がリセットされるかについての公式ドキュメントはないようですが、ここに非公式リストがあります。

sp_reset_connectionは、接続の次の側面をリセットします。

  • すべてのエラー状態と番号をリセットします(@@ errorなど)。
  • 並列クエリを実行する親ECの子スレッドであるすべてのEC(実行コンテキスト)を停止します
  • 未処理の未処理のI/O操作を待機します
  • 接続によってサーバー上の保持されているバッファを解放します
  • 接続で使用されているすべてのバッファリソースをロック解除します
  • 接続が所有して割り当てられたすべてのメモリを解放します
  • 接続によって作成された作業テーブルまたは一時テーブルをクリアします
  • 接続が所有するすべてのグローバルカーソルを強制終了します
  • 開いているSQL-XMLハンドルをすべて閉じます
  • 開いているSQL-XML関連の作業テーブルを削除します
  • すべてのシステムテーブルを閉じます
  • すべてのユーザーテーブルを閉じます
  • すべての一時オブジェクトを削除します
  • 開いているトランザクションを中止します
  • 参加すると、分散トランザクションから失敗します
  • 現在のデータベースのユーザーの参照カウントを減らします。共有データベースロックを解除するもの
  • 獲得したロックを解放します
  • 取得した可能性のあるハンドルを解放します
  • すべてのSETオプションをデフォルト値にリセットします
  • @@ rowcount値をリセットします
  • @@ identity値をリセットします
  • Dbcc traceon()を使用して、セッションレベルのトレースオプションをリセットします。

sp_reset_connectionはリセットされません。

  • セキュリティコンテキスト。これは、接続プールが正確な接続文字列に基づいて接続と一致する理由です。
  • アプリケーションロールは元に戻せないため、sp_setapproleを使用してアプリケーションロールを入力した場合
  • トランザクション分離レベル
73
Chris Klepeis