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を使用してアプリケーションロールを入力した場合、applicationrolesは元に戻せないため
- トランザクション分離レベル