Sql Profiler が "sp_reset_connection" を発行することによって何を意味するのかを理解しようとしています。
次のような「exec sp_reset_connection」行があり、その後にBatchStartingとCompletedが続きます。
RPC:Completed exec sp_reset_connection
SQL:BatchStarting SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c]
SQL:BatchCompleted SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c]
基本的に、最初の行の「exec sp_reset_connection」は、プロセス全体 (接続が開かれ、select ステートメントが実行され、その後接続が閉じられてプールに戻される) が実行されたことを意味しますか? それとも、接続はまだ開いている段階ですか。
また、sp_reset_connection が自分の select ステートメントの前に実行されるのはなぜですか。リセットはユーザーの sql の後に実行されるべきではないのですか?
接続がいつ開かれ、閉じられたかをもっと詳しく知る方法はあるでしょうか?
「exec sp_reset_connection」と表示されるということは、接続が閉じられていることを意味しますか?
ベストアンサー1
他の回答にあるように、sp_reset_connection
接続プールが再利用されていることを示します。 1 つの特定の結果に注意してください。
sp_reset_connection は、トランザクション分離レベルを以前の接続の設定からサーバーのデフォルトにリセットしません。
アップデート: SQL 2014 以降、TDS バージョン 7.3 以降のクライアント ドライバーの場合、トランザクション分離レベルはデフォルトにリセットされます。
参照:SQL Server: プールされた接続間での分離レベルのリーク
追加情報は次のとおりです:
ODBC、OLE-DB、System.Data.SqlClient などのデータ アクセス API レイヤーはすべて、接続プールから接続を再利用するときに (内部) ストアド プロシージャ sp_reset_connection を呼び出します。これは、接続が再利用される前に接続の状態をリセットするために行われますが、リセットされる内容についてはどこにも記載されていません。この記事では、リセットされる接続の部分について記載します。
sp_reset_connection は接続の次の側面をリセットします。
すべてのエラー状態と番号(@@error など)
並列クエリを実行している親 EC の子スレッドであるすべての EC (実行コンテキスト) を停止します。
未処理のI/O操作を待機します
接続によってサーバー上に保持されたバッファを解放します
接続で使用されているバッファリソースのロックを解除します
接続によって所有されているすべての割り当て済みメモリを解放します
接続によって作成された作業テーブルまたは一時テーブルをクリアします
接続によって所有されているすべてのグローバルカーソルを削除します
開いているSQL-XMLハンドルをすべて閉じます
開いているSQL-XML関連の作業テーブルを削除します。
すべてのシステムテーブルを閉じます
すべてのユーザーテーブルを閉じます
すべての一時オブジェクトを削除します
開いているトランザクションを中止する
登録時の分散トランザクションの欠陥
現在のデータベース内のユーザーの参照カウントを減らし、共有データベースロックを解除します。
取得したロックを解放する
取得したハンドルを解放する
すべてのSETオプションをデフォルト値にリセットします
@@rowcount 値をリセットします
@@identity値をリセットします
dbcc traceon() を使用してセッション レベルのトレース オプションをリセットします。
NULL
SQL Server 2005 以降でCONTEXT_INFO をリセットします[元の記事の一部ではありません]sp_reset_connection はリセットしません:
セキュリティコンテキスト。接続プールが正確な接続文字列に基づいて接続を一致させる理由です。
アプリケーションロールは次のように入力しましたsp_setapprole、SQL Server 2005より前ではアプリケーションロールをまったく元に戻すことができなかったためです。SQL Server 2005以降では、アプリケーションロールを元に戻すことができますが、セッションの一部ではない追加情報がある場合のみ元に戻すことができます。接続を閉じる前に、アプリケーションロールを手動で元に戻す必要があります。sp_unsetapprole
sp_setapprole
実行時にキャプチャされる「Cookie」値を使用します。
注: 常に変化する Web の中でリストが失われないように、ここにリストを含めています。